Параметр requirements атрибута Route
Параметр requirements атрибута Route задаёт
ограничение на значение динамического сегмента URL.
Передаётся массивом, где ключ - это имя параметра маршрута,
а значение - регулярное выражение, которому должна
соответствовать часть URL. Если URL не проходит проверку,
маршрут не будет сопоставлен, и Symfony вернёт ошибку 404.
Этот параметр особенно полезен, когда нужно ограничить сегмент только цифрами, буквами или определённым форматом, чтобы избежать неоднозначности между похожими маршрутами.
Синтаксис
#[Route(path, name: name, requirements: ['param' => 'regexp'])]
Пример
Давайте ограничим параметр id так, чтобы он
принимал только цифры:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/{id}', name: 'article_show', requirements: ['id' => '\d+'])]
public function show(int $id): Response
{
return new Response('article ' . $id);
}
}
?>
Результат выполнения кода для адреса /article/5:
"article 5"
Результат выполнения кода для адреса /article/abcde:
"404 Not Found"
Пример
Давайте ограничим параметр slug только строчными
буквами, цифрами и дефисом:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/{slug}', name: 'article_slug', requirements: ['slug' => '[a-z0-9-]+'])]
public function slug(string $slug): Response
{
return new Response($slug);
}
}
?>
Результат выполнения кода для адреса /article/abcde:
"abcde"
Результат выполнения кода для адреса /article/Abcde:
"404 Not Found"
Пример
Давайте зададим ограничения сразу для нескольких параметров:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/user/{id}/{name}', name: 'article_user', requirements: ['id' => '\d+', 'name' => '[a-z]+'])]
public function user(int $id, string $name): Response
{
return new Response($id . ' ' . $name);
}
}
?>
Результат выполнения кода для адреса /user/5/abcde:
"5 abcde"
Результат выполнения кода для адреса /user/abcde/5:
"404 Not Found"