Attributes for Symfony route

2.2k Views Asked by At

In Symfony controllers, route are defined as follow :

class BlogController extends AbstractController
{
    #[Route('/blog/{page}', name: 'blog_list', requirements: ['page' => '\d+'])]
    public function list(int $page): Response
    {
        // ...
    }
}

Imagine now, you have a request or query parameter in this url. There's no functional need to define it in the route, it is accessible through $request->get('parameter_name').

class BlogController extends AbstractController
{
    #[Route('/blog/{page}', name: 'blog_list', requirements: ['page' => '\d+'])]
    public function list(Request $request, int $page): Response
    {
        $id = $request->get('id');
    }
}

But I'm wondering if it is not more clear to define this parameter as attribute. For exemple like this :

class BlogController extends AbstractController
{
    #[Route('/blog/{page}', name: 'blog_list', requirements: ['page' => '\d+', 'id' => '\d+'])]
    public function list(Request $request, int $page): Response
    {
        $id = $request->get('id');
    }
}

But in that case, Symfony won't check the type of the attribute (ie, url like /blog/1?id="foo" will work).

So maybe something like this with annotations

class BlogController extends AbstractController
    {
        
    /**
     * @param int id Id of the post to be highlighted
     */
    #[Route('/blog/{page}', name: 'blog_list', requirements: ['page' => '\d+', 'id' => '\d+'])]
        public function list(Request $request, int $page): Response
        {
            $id = $request->get('id');
        }
    }
}

Or maybe as suggested here for Laravel :

class BlogController extends AbstractController
    {
        
   /**
    * Returns list of posts. 
    * Request object may have optional query int parameter 'id'
    * used for highlighting a specific post
    *
    * @param Request $request
    * @return Response
    */
    #[Route('/blog/{page}', name: 'blog_list', requirements: ['page' => '\d+', 'id' => '\d+'])]
        public function list(Request $request, int $page): Response
        {
            $id = $request->get('id');
        }
    }
}

So what is the best option for a clear and well documented code ?

1

There are 1 best solutions below

0
Jakonda On

I was searching this question as well. There is no way illustrating params and return types throug attributes. I think mixing annotations and attributes is ok for now. May be it will be available in later versions of php