Symfony Routing — Как сопоставить маршрут на основе хоста

Вы можете указать соответствие входящего запроса на основе HTTP хоста.

mobile_homepage:
    path:     /
    host:     m.example.com
    defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage }

homepage:
    path:     /
    defaults: { _controller: AcmeDemoBundle:Main:homepage }

Оба маршрута соответствуют одному и тому же пути — /, однако первый будет соответствовать запросу, только если хостом будет являться m.example.com.

Использование заполнителей

Опция host имеет тот же синтаксис, что используется в системе сопоставления путей. Это означает, что вы можете использовать заполнители в своем имени хоста:

projects_homepage:
    path:     /
    host:     "{project_name}.example.com"
    defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage }

homepage:
    path:     /
    defaults: { _controller: AcmeDemoBundle:Main:homepage }

Вы также можете установить требования и опции по умолчанию для этих заполнителей. Например, если вы хотите указать соответствие и m.example.com и mobile.example.com, используйте следующее:

mobile_homepage:
    path:     /
    host:     "{subdomain}.example.com"
    defaults:
        _controller: AcmeDemoBundle:Main:mobileHomepage
        subdomain: m
    requirements:
        subdomain: m|mobile

homepage:
    path:     /
    defaults: { _controller: AcmeDemoBundle:Main:homepage }

Разрешено использовать параметры службы, если не требуется жёсткого указания имени хоста:

mobile_homepage:
    path:     /
    host:     "m.{domain}"
    defaults:
        _controller: AcmeDemoBundle:Main:mobileHomepage
        domain: "%domain%"
    requirements:
        domain: "%domain%"

homepage:
    path:  /
    defaults: { _controller: AcmeDemoBundle:Main:homepage }

Убедитесь, что вы включаете опцию по умолчанию domain для заполнителя, иначе вам нужно будет указывать имя домена при каждом генерировании URL, использующего маршрут.

Использование хоста, соответствующего импортируемым маршрутам

Установить опцию хоста импортируемым маршрутам можно следующим образом:

acme_hello:
    resource: "@AcmeHelloBundle/Resources/config/routing.yml"
    host:     "hello.example.com"

Хост hello.example.com будет установлен на каждом маршруте, загруженном из нового ресурса маршрутизации.

Тестирование контроллеров

Вам необходимо установить HTTP-заголовок хоста в своих объектах запросов, если вы хотите пройти проверку адреса в ваших функциональных тестах.

$crawler = $client->request(
    'GET',
    '/homepage',
    array(),
    array(),
    array('HTTP_HOST' => 'm.' . $client->getContainer()->getParameter('domain'))
);

Примечание

Это перевод статьи «How to Match a Route Based on the Host (Symfony Routing component)» из официальной документации Symfony 2.7.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *