Новое в Symfony 6.3 — Сопоставитель параметров запроса

Источник: «New in Symfony 6.3: Query Parameters Mapper»
Symfony 6.3 включает новый атрибут MapQueryParameter для сопоставления и проверки отдельных параметров строки запроса с аргументами контроллера.

В Symfony 6.3 мы представили возможность сопоставлять данные запроса в типизированные объекты, используя атрибуты #[MapRequestPayload] и #[MapQueryString]. Однако иногда вам нужно сопоставить данные отдельных запросов с конкретными аргументами контроллера.

Symfony позволяет сопоставлять параметры маршрута с аргументами контроллера, начиная с первой версии. В Symfony 6.3 вы также сможете сопоставлять параметры строки запроса с конкретным аргументом контроллера. Для этого используйте новый атрибут #[MapQueryParameter]:

#[Route(path: '/', name: 'admin_dashboard')]
public function indexAction(
#[MapQueryParameter] array $ids,
#[MapQueryParameter] string $firstName,
#[MapQueryParameter] bool $required,
#[MapQueryParameter] int $age,
#[MapQueryParameter] string $category = '',
#[MapQueryParameter] ?string $theme = null,
)

Если строка запроса входящего запроса имеет вид /?ids[]=1&ids[]=2&firstName=Ruud&required=3&age=123, этот код заставит аргументы контроллера иметь следующие значения:

$ids = ['1', '2']
$firstName = "Ruud"
$required = false
$age = 123
$category = ''
$theme = null

Атрибут #[MapQueryParameter] выполняет преобразование параметра строки запроса (который всегда является строкой) в правильный PHP тип в соответствии с типами аргументов вашего контроллера (это похоже на вызов $request->query->getInt('...'), $request->query->getAlpha('...') и т.д., но автоматизировано Symfony).

Для более продвинутых вариантов использования вы можете использовать опцию filter для проверки сведений о типе данных:

// это гарантирует, что массив содержит только целочисленные значения
#[MapQueryParameter(filter: \FILTER_VALIDATE_INT)]
array $ids

// это гарантирует, что строка следует определённому шаблону
#[MapQueryParameter(filter: \FILTER_VALIDATE_REGEXP, options: ['regexp' => '/^\w++$/'])]
string $name

Дополнительные материалы

Предыдущая Статья

CSS: Свойства трансформации translate, rotate и scale

Следующая Статья

Vanilla JavaScript: Как работать с датами и временем