Группы проверки поля коллекции

#php #symfony #symfony-forms #symfony4

#php #symfony #symfony-forms #symfony4

Вопрос:

Привет, у меня такая проблема с типом коллекции

 ->add('attributes', CollectionType::class, [
    'entry_type' => CriteriaForm::class,
    'allow_add' => true,
    'required' => false,
    'constraints' => [
        new Valid(),
    ],
])
  

форма CriteriaForm выглядит следующим образом

 public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('from', TextType::class, [
            'required' => false,
            'constraints' => [
                new Date([
                    'groups' => [
                        'date_type'
                    ]
                ]),
                new Type([
                    'type' => 'integer',
                    'groups' => [
                        'number_type'
                    ],
                ])
            ]
        ])
        ->add('to', TextType::class, [
            'required' => false,
            'constraints' => [
                new Date([
                    'groups' => [
                        'date_type'
                    ]
                ]),
                new Type([
                    'type' => 'integer',
                    'groups' => [
                        'number_type'
                    ],
                ])
            ]
        ])
        ->add('formType', TextType::class, [
            'constraints' => [
                new NotNull(),
                new NotBlank(),
            ]
        ])
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver
        ->setDefaults([
            'validation_groups' => function (FormInterface $form) {
                $data = $form->getData();

                if ($data['formType'] === 'date') {
                    return ['Default', 'date_type'];
                }

                return ['Default', 'number_type'];
            },
        ]);
}
  

и обратный вызов validation_groups никогда не выполняется

Редактировать:

Контроллер

 $form = $this->formFactory->create(SearchCriteriaForm::class);
$form->submit(json_decode($request->getContent(), true));

if (!$form->isValid()) {
    return new JsonResponse(null, Response::HTTP_BAD_REQUEST);
}

return new JsonResponse();
  

Правка 2: «Решение»
У меня также была установлена опция datamapper для формы, и я обнаружил, что данные сопоставляются с object перед проверкой, и в этом была проблема. Я получил исключение от своего объекта, поэтому я предположил, что проверка не работает.

Комментарии:

1. Не могли бы вы показать мне свой контроллер?

Ответ №1:

Во-первых, убедитесь, что ваш запрос — POST или PUT

Вместо того, чтобы делать это

$form->submit(json_decode($request->getContent(), true));

Сделайте это:

 $request->request->replace(json_decode($$request->getContent(), true));
  

А затем заставить форму обработать запрос и затем применить валидатор

 $form->handleRequest($request);
  

Теперь должна быть запущена проверка.