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

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

25 голосов
/ 09 февраля 2011

Как настроить маршрутизацию по умолчанию в 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/...

Ответы [ 10 ]

28 голосов
/ 25 октября 2011

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

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

default_route:
    pattern: /{url}
    defaults: { _controller: AcmeBundle:Default:index, url: "index" }
    requirements:
        url: ".+"
8 голосов
/ 09 апреля 2011

// Symfony2 PR10

в routing.yml:

default:
    pattern:  /{_controller}

Это позволяет использовать URL-адреса такого типа: http://localhost/MySuperBundle:MyController:myview

8 голосов
/ 25 февраля 2011

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

4 голосов
/ 28 января 2013

Стандартный компонент маршрутизации 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).

3 голосов
/ 09 февраля 2011

Вот пример: 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-]+" 
2 голосов
/ 19 декабря 2011

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

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

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

2 голосов
/ 10 июля 2011

Кроме того, вы можете использовать аннотацию @Route непосредственно в файле контроллера.см. https://github.com/sensio/SensioFrameworkExtraBundle/blob/master/Resources/doc/annotations/routing.rst

Что касается маршрутов по умолчанию, я думаю, что Symfony2 поддерживает явное сопоставление маршрутов.

1 голос
/ 10 января 2013

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

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

1 голос
/ 28 сентября 2011

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

0 голосов
/ 05 апреля 2018

Это зависит ... Некоторые из моих выглядят так:

api_email:
resource: "@MApiBundle/Resources/config/routing_email.yml"
prefix: /

и некоторые выглядят как

api_images:
path:     /images/{listingId}/{width}/{fileName}
defaults: { _controller: ApiBundle:Image:view, listingId: null, width: null, fileName: null }
methods:  [GET]
requirements:
    fileName: .+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...