Symfony validate request
У меня есть роут, который получает данные из одной из форм по ajax и дальше эти данные идут на другой сервер. Но я не могу понять, как можно валидировать пришедшие данные? Когда пользовалеся laravel, то это делалось довольно просто
public function bookNewPerson()
{
$attributes = request()->validate(
[
'dateTime' => 'required',
'lastName' => 'required|string|between:3,15',
'phoneNumber' => 'required|string|between:13,13',
]
);
// ...
}
Как я могу валидировать входящий запрос? Entity для этих данных у меня нет, т.к. я не планирую с ними работать, в БД они не хранятся. Как быть?
Ответы (3 шт):
1) Для валидации не имеет значение значение, Entity это или нет. Для Валидатора это просто класс с аннотациями.Создаете класс, в котором ваши данные из request. Прописываете в нем правила валидации через анотации и валидируете. https://symfony.com/doc/current/validation.html
2) Можно так же создавать правила без аннотаций и дополнительного класса: https://symfony.com/doc/current/validation/raw_values.html
Чтобы не дублировать код, вот есть ответ с примерами: https://stackoverflow.com/questions/54737796/validation-for-rest-api-in-symfony-4
В симфони можно по разному валидировать, но Вы пишите, что у вас есть некая форма, можете подробней прочитать в документации валидация формы
Создаёте php-класс формы. Если она не привязана к сущности то указываете 'data_class' => null.
class YourFormType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('field', TextType::class, [
'required' => true,
'constraints' => [
new NotBlank(),
],
]);
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => null,
]);
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return '';
}
}
А в контроллере создаёте экземпляр формы и делаете валидацию
class YourController extends AbstractController
{
/**
* @Route("/search", name="search")
* @param Request $request
* @return Response
*/
public function searchAction(Request $request)
{
$form = $this->createForm(YourFormType::class, null, [
'method' => 'GET',
'action' => '',
]);
$form->handleRequest($request);
if (!$form->isValid()) {
$errors = $form->getErrors(true);
// ...
}
// ...
}
}
ps. Отобразить поля формы также можно достаточно просто указав в шаблоне:
{{ form(form) }}
Есть Бандлы похожие на Laravel:
Компонент проверки запросов для Symfony. Упрощает проверку свойств запроса (объекта Request) без необходимости использования формы Symfony: symfony-request-validation
Описание валидации запроса (объекта Request) через нотации: RequestValidatorBundle