Routing у Symfony framework (Урок 6. Роутинг)

После того, как мы научились создавать контроллеры (здесь) теперь важно понять, каким образом пользователь может вызвать контроллер и как с ним работать.

Особенностью Symfony framework является routing система. Если, например, в yii framework по умолчанию роутинг определяется файловой структурой приложения (но это не запрещает вам использовать систему роутинга, для этого есть необходимые инструменты), то в Symfony framework вам обязательно придется задавать routing вручную (не считая базового, созданного генератором бандла).

Что же такое routing? Грубо говоря, это набор правил, который связывает переданное в GET-строке с логикой приложения, определяет контроллер, параметры и т.д. (Надеюсь, если вы читаете это, то уже знаете, что такое GET-запрос и каким образом передаются параметры скрипту. Здесь нечто похожее, но используется modrewrite, так что GET-строка не будет выглядеть привычно.)

Итак, базовым файлом, задающим роутинг есть app/config/routing.yml. Но этот файл, как правило, не должен определять пути вашего приложения - он просто должен загрузить routing-файл из вашего bundle. Например,

# app/config/routing.yml
acme_hello:
   resource: "@AcmeHelloBundle/Resources/config/routing.yml"
Теперь, к самому routing.

Первая строка содержит имя роута. Если вы используете yml-формат, то она ни на что не влияет, только для удобства. Вторая строка говорит, что надо загрузить файл роутинга из вашего бандла, по соответствующему адресу.

У нашем примере вся информация о роутах содержится в src/path_to_bundle/Resources/config/routing.yml

Итак. Допустим, пользователь набирает в адресной строке что-то вроде http://site.ru/blog. Для того, чтобы это действие вызывало метод actionBlog контроллера, достаточно:

# app/config/routing.yml
 blog_show:
   path: /blog
   defaults: { _controller: AcmeBlogBundle:Blog:show }
В приведенном фрагменте мы говорим роутеру передавать запросы вида site.net/blog контроллеру BlogController, методу showAction. Обратите внимание, что в таком виде в роут контроллера и action не входят эти слова (Controller, Action). defaults указывает параметры по умолчанию. Здесь мы указали значение параметра _controller, который и задает, какой контроллер Symfony framework обработает запрос.

Передача параметров осуществляется следующим образом: Например, вы хотите передать параметр name. Адрес тогда будет выглядеть следующим образом: site.net/blog/name. Указать это роутеру можно следующим образом:

# app/config/routing.yml
 blog_show:
   path: /blog/{name}
   defaults: { _controller: AcmeBlogBundle:Blog:show }
Таким образом, мы задали параметр для метода showAction($name). Как вы уже, наверное, догадались, можно задать значение этого параметра по умолчанию в defaults и тогда он не будет обязательным:
//...
defaults: { _controller: AcmeBlogBundle:Blog:show, name: user }
Таким способом, например, можно реалищировать пагинацию (разбитие на страницы) и многое другое.

Кроме того, можно указывать требуемый тип параметра для Symfony framework controller (например, для той же пагинации) регулярным выражением:

blog:
  path: /blog/{page}
  defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
  requirements:
    page: d+
Указанный фрагмент разрешает только integer значения параметра page.

Также вы можете явно указать разрешенные значения параметра. Например,

homepage:
  path: /{culture}
  defaults: { _controller: AcmeDemoBundle:Main:homepage, culture: en }
  requirements:
    culture: en|fr
Также можно задавать тип запросов:
homepage:
  path: /{culture}
  defaults: { _controller: AcmeDemoBundle:Main:homepage, culture: en }
  requirements:
    culture: en|fr
  methods: [GET]
Для просмотра текущих роутов системы, введите в консоли
php app/console router:debug
Важно! После изменения конфигурации роутов нужно чистить кэш (иначе вы не увидите изменений):
php app/console cache:clean --env=prod --no-debug
(Для продакшн сборки)