Как настроить маршрутизацию по умолчанию в 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/...
Я смотрел в кулинарной книге ответ на этот вопрос и думаю, что нашел его здесь . По умолчанию все параметры маршрута имеют скрытое требование, чтобы они соответствовали любому символу, кроме символа / ([^ /] +), но это поведение можно переопределить ключевым словом требований, заставив его соответствовать любому символу.
Следующее должно создать маршрут по умолчанию, который ловит всех остальных, и как таковой, должен быть последним в вашей конфигурации маршрутизации, поскольку любые последующие маршруты никогда не будут совпадать. Чтобы убедиться, что он совпадает с «/», включено значение по умолчанию для параметра url.
default_route: pattern: /{url} defaults: { _controller: AcmeBundle:Default:index, url: "index" } requirements: url: ".+"
Я не думаю, что это возможно со стандартным компонентом маршрутизации. Взгляните на этот пакет, это может помочь: https://github.com/hidenorigoto/DefaultRouteBundle
// Symfony2 PR10
в routing.yml:
default: pattern: /{_controller}
Он позволяет использовать такие типы URL: http: // localhost / MySuperBundle: MyController: myview
Стандартный компонент маршрутизации 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).
Вот пример: 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-]+"
Кроме того, вы можете использовать аннотацию @Route непосредственно в файле контроллера. см. https://github.com/sensio/SensioFrameworkExtraBundle/blob/master/Resources/doc/annotations/routing.rst
Что касается маршрутов по умолчанию, я думаю, что Symfony2 поощряет явное сопоставление маршрутов.
Создание маршрута по умолчанию не является хорошим способом программирования. Зачем? Потому что по этой причине было реализовано исключение. Symfony2 построен только для правильного решения.
Если вы хотите перенаправить все «не найденные» маршруты, вы должны использовать исключение, например NotFound404 или что-то подобное. Вы даже можете настроить эту страницу самостоятельно.
Один маршрут предназначен для одной цели. Всегда. Другие думают, что плохо.
Вы можете создать свой собственный пакет, который обрабатывал все запросы и использовал параметры URL для построения строки для перехода к прямому методу контроллера. Но это довольно дрянной, я бы пошел с четко определенными маршрутами, он очистил ваши URL-адреса и отменил имена URL-адресов и контроллеров. Если вы переименовываете пакет или что-то еще, вам нужно реорганизовать свои URL-адреса?
Если вы хотите создать «поймать все», лучшим вариантом будет захват KernelEvents::EXCEPTION
. Это событие запускается всякий раз, когда исключение попадает в HttpKernel
, это включает NotFoundHttpException
когда маршрутизатор не может разрешить маршрут к контроллеру.
Эффект будет похож на стилизованную страницу 404 Symfony, которая будет отображаться при отправке запроса через app_dev.php. Вместо того, чтобы возвращать 404, вы выполняете любую логику, которую вы ищете.