Параметр host атрибута Route
Параметр host атрибута Route задаёт доменное имя,
на котором доступен маршрут. Если запрос приходит
с другого хоста, маршрут не будет сопоставлен.
В значении можно использовать регулярные выражения
и именованные плейсхолдеры, например {subdomain}.
Это позволяет обслуживать разные поддомены одним контроллером.
Параметр передаётся именованным аргументом host
в атрибут Route. Значение - строка с доменом.
Синтаксис
#[Route(path, name: name, host: 'example.com')]
Пример
Давайте ограничим маршрут доменом 'example.com':
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index', host: 'example.com')]
public function index(): Response
{
return new Response('hello');
}
}
?>
Результат выполнения кода для адреса example.com/:
"hello"
Для адреса other.com/ маршрут не сработает и вернётся ошибка 404.
Пример
Давайте используем поддомен как плейсхолдер и примем его значение в контроллере:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/user', name: 'article_user', host: '{subdomain}.example.com')]
public function user(string $subdomain): Response
{
return new Response($subdomain);
}
}
?>
Результат выполнения кода для адреса abcde.example.com/user:
"abcde"
Пример
Давайте ограничим плейсхолдер поддомена регулярным выражением через параметр requirements:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/user', name: 'article_user', host: '{subdomain}.example.com', requirements: ['subdomain' => 'user|admin'])]
public function user(string $subdomain): Response
{
return new Response($subdomain);
}
}
?>
Результат выполнения кода для адреса user.example.com/user:
"user"
Для адреса guest.example.com/user маршрут не сработает.
Смотрите также
-
атрибут
Route,
который вешает метод контроллера на указанный URL -
параметр
path,
который задаёт путь маршрута -
параметр
name,
который задаёт имя маршрута -
параметр
requirements,
который задаёт регулярные выражения для плейсхолдеров