Маршруты в Symfony

Конфигурация маршрутизации определяет, какое действие должно выполняться для каждого входящего URL

    Маршруты

    Атрибуты 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}

    Необязательные параметры


    Источники
    Последнее изменение: 29.04.2026 22:07


    Связанные темы
    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ