Как позволить знак "/" в параметре маршрута

Дата обновления перевода 2023-06-29

Как позволить знак "/" в параметре маршрута

Иногда вам может понадобиться составить URL с парамерами, которые могут содержать слеш /. Например, рассмотрите маршрут /share/{token}. Если значение token содержит символ /, то этот маршрут не будет совпадать. Это так, потому что Symfony использует этот символ в качестве разделителя между частями маршрута.

Эта статья объясняет, как вы можете изменить определение маршрута, чтобы заполнители тоже могли содержать символ /.

Сконфигурируйте маршрут

По умолчанию, компонент Symfony Маршрутизация требует, чтобы параметры совпадали со следующим регулярным выражением: [^/]+. Это означает, что разрешены все символы, кроме /.

Вы дожны ясно позволить / быть частью вашего заполнителя, указав более ползволительное регулярное выражение для этого:

1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\Routing\Annotation\Route;

class DefaultController
{
    /**
     * @Route("/share/{token}", name="share", requirements={"token"=".+"})
     */
    public function share($token)
    {
        // ...
    }
}

Вот и всё! Теперь параметр {token} может содержать символ /.

Note

Если маршрут включает в себя особенный заполнитель {_format}, то вам не стоит использовать требование .+ для параметров, позволяющих слеши. Например, если шаблон /share/{token}.{_format}, а {token} позволяет любые символы, то URL /share/foo/bar.json будет рассматривать foo/bar.json, как токен, и формат будет пустым. Это можно решить, заменив требование .+ на [^.]+, чтобы позволить любые символы, кроме точек.

Note

Если маршрут определяет несколько заполнителей, и вы применяете это позволительное регулярное выражение ко всем из них, то результаты не будут ожидаемы. Например, если определение маршрута - /share/{path}/{token}, а path и token принимают /, то path будет содержать своё содержимое и токен, а token будет пустым.