Як дозволити символ "/" у параметрі маршруту

Дата оновлення перекладу 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 буде порожнім.