Как определять требования маршрутов
Дата обновления перевода 2023-07-06
Как определять требования маршрутов
Требования маршрутов могут быть использованы так, чтобы
определённый маршрут соответствовал только при определённых условиях. Простейший пример
включает в себя ограничение маршрута {wildcard}
так, чтобы он соответствовал
только некоторым регулярным выражениям:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// src/Controller/BlogController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
class BlogController extends Controller
{
/**
* @Route("/blog/{page}", name="blog_list", requirements={"page"="\d+"})
*/
public function list($page)
{
// ...
}
}
Благодаря требованию \d+
(т.е. "числовое значение" любой длины), /blog/2
будет
соответствовать этому маршруту, но /blog/some-string
- не будет.
Так как требования параметров - это регулярный выражения, сложность и гибкость каждого требования полностью зависит от вас. Представьте, что домашняя страница вашего приложения доступна на двух разных языках, основываясь на URL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// src/Controller/MainController.php
// ...
class MainController extends Controller
{
/**
* @Route("/{_locale}", defaults={"_locale"="en"}, requirements={
* "_locale"="en|fr"
* })
*/
public function homepage($_locale)
{
}
}
Для входящих запросов, часть URL {_locale}
соответствует регулярному
выражению (en|fr)
.
???? | ????????? |
---|---|
/ |
{_locale} = "en" |
/en |
{_locale} = "en" |
/fr |
{_locale} = "fr" |
/es |
?? ????? ??????????????? ????? ???????? |
Note
Вы можете подключить сопоставление маршрутов UTF-8, установив опцию
utf8
при объявлении или импортировании маршрутов. Таким образом,
к примеру, .
в требованиях будет совпадать с любыми символами UTF-8,
а не только с одним байтом.
Tip
Требования маршрутов также могут включать в себя параметры контейнеров, как объявсняется в этой статье. Это может быть полезным, когда регулярное выражение очень сложное и многократно используется в вашем приложении.
Добавление требований HTTP-методов
В дополнение к URL, вы также можете использовать соответствие в методе входящего запроса (т.е. GET, HEAD, POST, PUT, DELETE). Представьте, что вы создаёте API для вашего блога, и у вас есть 2 маршрута: один для отображения записи (по запросу GET или HEAD), и один для обновления записи (по запросу PUT). Этого можно достичь с помощью следующей конфигурации маршрута:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
// src/Controller/BlogApiController.php
namespace App\Controller;
// ...
class BlogApiController extends Controller
{
/**
* @Route("/api/posts/{id}", methods={"GET","HEAD"})
*/
public function show($id)
{
// ... return a JSON response with the post
}
/**
* @Route("/api/posts/{id}", methods="PUT")
*/
public function edit($id)
{
// ... edit a post
}
}
Несмотря на тот факт, что эти два маршрута имеют идентичные пути
(/api/posts/{id}
), первый маршрут будет соответствовать только запросам
GET или HEAD, а второй - только запросам PUT. Это означает, что вы можете отобразить
и изменить запись с одним и тем же URL, используя отдельные контроллеры для двух
действий.
Note
Если не указано никаких methods
(методов), то маршрут будет соответствовать
всем методам.
Tip
Если вы используете HTML-формы и HTTP-методы кроме GET
и POST
,
вам понадобится включить параметр _method
чтобы сымитировать HTTP-метод.
См. Как изменить действие и метод формы, чтобы узнать больше.
Добавление требования хоста
Вы также можете использовать соответствие в HTTP хосте входящего запроса. Чтобы узнать больше об этом, см. Как сделать так, чтобы маршрут соответствовал на основании хоста в документации компонента Маршрутизация.
Добавление динамических требований с выражениями
Для очень сложных требований вы можете использовать динамические выражения для соответствия любой информации по запросу. Смотрите Условия маршрутизации.