Как определять требования маршрутов

Дата обновления перевода 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 хосте входящего запроса. Чтобы узнать больше об этом, см. Как сделать так, чтобы маршрут соответствовал на основании хоста в документации компонента Маршрутизация.

Добавление динамических требований с выражениями

Для очень сложных требований вы можете использовать динамические выражения для соответствия любой информации по запросу. Смотрите Условия маршрутизации.