Как позволить знак "/" в параметре маршрута
Дата обновления перевода 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
будет пустым.