Маршруты в Symfony
Маршруты
Атрибуты PHP позволяют определять маршруты рядом с кодом контроллеров, связанных с этими маршрутами.
Атрибуты по умолчанию включены в приложениях Symfony, использующих Symfony Flex
Если вы определяете несколько PHP-классов в одном файле, Symfony загружает только маршруты первого класса, игнорируя все остальные. Атрибут route всегда имеет приоритет над маршрутами, определенными в файлах YAML или PHP, и Symfony всегда загружает атрибут route.
Строка запроса в URL не учитывается при сопоставлении маршрутов. В этом примере URL-адреса вида /blog?foo=bar и /blog?foo=bar&bar=foo также будут соответствовать маршруту blog_list .
#[Route('/blog', name: 'blog_list')]
public function list(): Response
По умолчанию маршруты соответствуют любому HTTP-глаголу (GET, POST, PUT и т.д.) Используйте опцию methods, чтобы ограничить количество глаголов, на которые должен отвечать каждый маршрут
#[Route('/api/posts/{id}', methods: ['GET', 'HEAD'])]
HTML-формы поддерживают только методы GET и POST . Если вы вызываете маршрут с помощью метода, отличного от того, который используется в HTML-форме, добавьте скрытое поле с именем _method и укажите нужный метод (например, ). Если вы создаете формы с помощью Symfony Forms, это делается автоматически, если опция framework.http_method_override имеет значение true.
Используйте параметр env, чтобы зарегистрировать маршрут только в том случае, если текущая среда конфигурации соответствует заданному значению
#[Route('/tools', name: 'tools', env: 'dev')]
Вспомогательные команды console
debug:router выводит список всех маршрутов вашего приложения в том порядке, в котором их обрабатывает Symfony:
php bin/console debug:router
#отображать контроллеры, связанные с маршрутами
php bin/console debug:router --show-controllers
#только те маршруты, которые соответствуют заданному методу HTTP
php bin/console debug:router --method=GET
#Описание маршрута по названию
php bin/console debug:router app_lucky_number
#какой маршрут будет соответствовать заданному URL
php bin/console router:match /lucky/number/8
Параметры маршрута
В маршрутах Symfony переменные части заключаются в { }. Например, маршрут для отображения содержимого поста в блоге определяется как /blog/{slug}
В маршрутах может быть указано любое количество параметров, но каждый из них можно использовать только один раз в каждом маршруте (например, /blog/posts-about-{category}/page/{pageNumber}).
Имя переменной ({slug} в данном примере) используется для создания переменной PHP, в которой хранится содержимое маршрута и которая передается контроллеру. Если пользователь переходит по URL-адресу /blog/my-first-post, Symfony выполняет show() метод в классе BlogController и передает $slug = 'my-first-post' аргумент методу show() .
#[Route('/blog/{slug}', name: 'blog_show')]
public function show(string $slug): Response
{
Проверка параметров маршрута
Представьте, что в вашем приложении есть маршрут blog_show (URL: /blog/{slug}) и маршрут blog_list (URL: /blog/{page}).
Если пользователь запрашивает /blog/my-first-post, подойдут оба маршрута, и Symfony выберет тот, который был определен первым. Чтобы исправить это, добавьте проверку параметра {page} с помощью опции requirements
https://github.com/symfony/symfony/blob/8.0/src/Symfony/Component/Routing/Requirement/Requirement.php
Опция requirements определяет регулярные выражения PHP, которым должны соответствовать параметры маршрута, чтобы маршрут считался совпадающим. В этом примере \d+ — это регулярное выражение, которое соответствует цифре любой длины:
#[Route('/blog/{page}', name: 'blog_list', requirements: ['page' => '\d+'])]
Перечисление Requirement содержит набор часто используемых констант для регулярных выражений, таких как цифры, даты и UUID, которые можно использовать в качестве требований к параметрам маршрута.
#[Route('/blog/{page}', name: 'blog_list', requirements: ['page' => Requirement::DIGITS])]
Если пользователь не указал параметр в маршруте, можно использовать значение по умолчанию:
#[Route('/blog/{page}', name: 'blog_list', requirements: ['page' => '\d+'])]
public function list(int $page = 1): Response
{
Если вы хотите, чтобы в сгенерированном URL всегда указывалось какое-то значение по умолчанию (например, чтобы вместо /blog/1 в предыдущем примере генерировалось /blog), добавьте символ ! перед именем параметра: /blog/{!page}
Необязательные параметры






