Як дозволити символ "/" у параметрі маршруту
Дата оновлення перекладу 2023-06-23
Як дозволити символ "/" у параметрі маршруту
Іноді вам може знадобитися скласти URL з парамерами, які можуть містити
слеш /
. Наприклад, розгляньте маршрут /share/{token}
. Якщо значення token
містить символ /
, то цей маршрут не співпадатиме. Це так, тому що Symfony
використовує цей символ як роздільник між частинами маршруту.
Ця стаття пояснює, як ви можете змінити визначення маршруту, щоб заповнювачі
теж могли містити символ /
.
Сконфігуруйте маршрут
За замовчуванням, компонент Symfony Routing вимагає, щоб параметри співпадали
з наступним регулярним виразом: [^/]+
. Це означає, що дозволені всі
символи, крім /
.
Ви повинні ясно дозволити /
бути частиною вашого заповнювача, вказавши більш
вільний регулярний вираз для цього:
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
буде порожнім.