Як зробити так, щоб маршрут відповідав на засаді хоста
Дата оновлення перекладу 2023-06-24
Як зробити так, щоб маршрут відповідав на засаді хоста
Ви також можете зробити так, щоб маршрут відповідав на 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'))
);