Подтвердить что ты не робот

Маршрутизация в Symfony2

Как настроить маршрутизацию по умолчанию в Symfony2?

В Symfony1 это выглядело примерно так:

homepage:
  url:   /
  param: { module: default, action: index }

default_symfony:
  url:   /symfony/:action/...
  param: { module: default }

default_index:
  url:   /:module
  param: { action: index }

default:
  url:   /:module/:action/...
4b9b3361

Ответ 1

Я просматривал поваренную книгу для ответа на этот вопрос и думаю, что нашел здесь. По умолчанию все параметры маршрута имеют скрытое требование, чтобы они соответствовали любому символу, кроме символа /([^/] +), но это поведение может быть переопределено ключевым словом требований, заставляя его соответствовать любому символу.

Следующее должно создать маршрут по умолчанию, который ловит все остальные - и как таковой, должен быть последним в вашей конфигурации маршрутизации, поскольку любые последующие маршруты никогда не будут совпадать. Чтобы убедиться, что он соответствует "/", значение по умолчанию для параметра url включено.

default_route:
    pattern: /{url}
    defaults: { _controller: AcmeBundle:Default:index, url: "index" }
    requirements:
        url: ".+"

Ответ 2

Я не думаю, что это возможно со стандартным компонентом маршрутизации. Взгляните на этот комплект, это может помочь: https://github.com/hidenorigoto/DefaultRouteBundle

Ответ 4

Стандартный компонент маршрутизации Symfony2 не поддерживает его, но этот комплект заполняет пробел Symfony1 слева:

https://github.com/LeaseWeb/LswDefaultRoutingBundle

Он делает то, что вы ожидаете. Вы можете по умолчанию маршрутизировать пакет, используя этот синтаксис:

FosUserBundle:
  resource: "@FosUserBundle"
  prefix:   /
  type:     default

Он сканирует ваш пакет и автоматически добавляет маршруты к вашей таблице маршрутизаторов, которые вы можете отлаживать, выполнив:

app/console router:debug

Пример автоматически добавленных маршрутов по умолчанию:

[router] Current routes
Name                          Method Pattern
fos_user.user.login_check     ANY    /user/login_check.{_format}
fos_user.user.logout          ANY    /user/logout.{_format}
fos_user.user.login           ANY    /user/login.{_format}
...

Вы видите, что он также поддерживает автоматический выбор формата с помощью расширения файла (html, json или xml).

Ответ 5

Вот пример: http://docs.symfony-reloaded.org/master/quick_tour/the_big_picture.html#routing

Определение маршрута имеет только один обязательный параметр pattern и три параметра опций defaults, requirements и options.

Здесь маршрут из моего собственного проекта:

video:
    pattern:  /watch/{id}/{slug}
    defaults: { _controller: SiteBundle:Video:watch }
    requirements: { id: "\d+", slug: "[\w-]+" 

Ответ 7

Создание маршрута по умолчанию не является хорошим способом программирования. Зачем? Потому что по этой причине было реализовано исключение. Symfony2 построен для правильного правильного решения.

Если вы хотите перенаправить все "не найденные" маршруты, вы должны использовать исключение, например NotFound404 или что-то подобное. Вы даже можете настроить эту страницу самостоятельно.

Один маршрут предназначен для одной цели. Всегда. Другие считают, что плохо.

Ответ 8

Вы можете создать свой собственный пакет, который обрабатывал все запросы и использовал параметры URL для построения строки для перехода к методу пересылки контроллера. Но это довольно дрянной, я бы пошел с четко определенными маршрутами, он очистил ваши URL-адреса и отменил имена URL-адресов и контроллеров. Если вы переименовываете пакет или что-то еще, вам нужно реорганизовать свои URL-адреса?

Ответ 9

Если вы хотите создать "поймать всех", лучшим выбором будет захват события KernelEvents::EXCEPTION. Это событие срабатывает всякий раз, когда исключение попадает в HttpKernel, это включает в себя NotFoundHttpException, когда маршрутизатор не может разрешить маршрут к контроллеру.

Эффект будет похож на стилизованную страницу 404 Symfony, которая будет отображаться при отправке запроса через app_dev.php. Вместо того, чтобы возвращать 404, вы выполняете любую логику, которую вы ищете.