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