Новое в 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