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 ?
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