Как сделать так, чтобы маршрут соответствовал на основании хоста
Дата обновления перевода 2023-07-06
Как сделать так, чтобы маршрут соответствовал на основании хоста
Вы также можете сделатьтак, чтобы маршрут соответствовал на HTTP хосте входящего запроса.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
// src/Controller/MainController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
class MainController extends Controller
{
/**
* @Route("/", name="mobile_homepage", host="m.example.com")
*/
public function mobileHomepage()
{
// ...
}
/**
* @Route("/", name="homepage")
*/
public function homepage()
{
// ...
}
}
Оба маршрута соответствуют одинакому пути /
, однако первый будет соответствовать
только, если хост будет m.example.com
.
Использование заполнителей
Опция хоста использует тот же синтаксис, что и система соответствия путей. Это означает, что вы можете использовать заполнители в имени вашего хоста:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
// src/Controller/MainController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
class MainController extends Controller
{
/**
* @Route("/", name="projects_homepage", host="{project_name}.example.com")
*/
public function projectsHomepage()
{
// ...
}
/**
* @Route("/", name="homepage")
*/
public function homepage()
{
// ...
}
}
Вы также можете установить условия и опции по умолчанию для этих заполнителей.
Например, если вы хотите, чтобы соответствовал и m.example.com
и mobile.example.com
,
вы будете использовать следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
// src/Controller/MainController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
class MainController extends Controller
{
/**
* @Route(
* "/",
* name="mobile_homepage",
* host="{subdomain}.example.com",
* defaults={"subdomain"="m"},
* requirements={"subdomain"="m|mobile"}
* )
*/
public function mobileHomepage()
{
// ...
}
/**
* @Route("/", name="homepage")
*/
public function homepage()
{
// ...
}
}
Tip
Вы также можете использовать параметры сервиса, если вы не хотите жестко кодировать имя хоста:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
// src/Controller/MainController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
class MainController extends Controller
{
/**
* @Route(
* "/",
* name="mobile_homepage",
* host="m.{domain}",
* defaults={"domain"="%domain%"},
* requirements={"domain"="%domain%"}
* )
*/
public function mobileHomepage()
{
// ...
}
/**
* @Route("/", name="homepage")
*/
public function homepage()
{
// ...
}
}
Tip
Убедитесь в том, что вы также включаете опцию по умолчанию для заполнителя
domain
, иначе вам понадобится включать значение домена каждый раз, когда
вы будете генерировать URL используя маршрут.
Использование соответствия хостов в импортированных маршрутах
Вы также можете установить опцию хоста в импортированных маршрутах:
1 2 3 4 5 6 7 8 9 10 11 12 13
// src/Controller/MainController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route(host="hello.example.com")
*/
class MainController extends Controller
{
// ...
}
Хост hello.example.com
будет установлен на каждом маршруте, загружаемом из нового
ресурса маршрутизации.
Тестирование ваших контроллеров
Вам нужно установить HTTP-заголовок хоста в ваших объектах запроса, если вы хотите продвинуться в ваших тестах дальше, чем соответствие URL.
1 2 3 4 5 6 7
$crawler = $client->request(
'GET',
'/homepage',
array(),
array(),
array('HTTP_HOST' => 'm.' . $client->getContainer()->getParameter('domain'))
);