Поле проверки Symfony, если другое поле имеет конкретное значение - PullRequest
0 голосов
/ 11 февраля 2019

Пример кода:

$dataContent = json_decode($request->getContent(), true);

$dataToCheck = [
            'name' => [
                new Assert\Required(),
                new Assert\NotBlank(),
                new Assert\Type('string'),
                new Assert\Length(['min' => 4]),
            ],
            'nick' => [
                new Assert\Required(),
                new Assert\NotBlank(),
                new Assert\Type('string'),
                new Assert\Length(['min' => 4]),
            ],
            'email' => [
                new Assert\Required(),
                new Assert\NotBlank(),
                new Assert\Email(),
            ],
            'roleInCompany' => [
                new Assert\Required(),
                new Assert\NotBlank(),
                new Assert\Type('string'),
                new Assert\Choice(['choices' => ['manager',''supervisor','team leader']]),
            ],
            'task' => [
                new Assert\Required(),
                new Assert\NotBlank(),
                new Assert\Type('string'),
             ]

]

$constraint = new Assert\Collection($dataToCheck);
$violations = $validator->validate($dataContent, $constraint);

В приведенном выше примере я хотел бы проверить 'задачу', только если для 'roleInCompany' установлено значение 'supervisor'.В другом случае проверка 'задачи' должна быть пропущена.Я не могу использовать класс сущностей, поэтому мне приходится работать только с данными, как в примере, который я опубликовал.

Пожалуйста, помогите мне, как это сделать.Спасибо.

1 Ответ

0 голосов
/ 11 февраля 2019

Для того, чтобы что-то сделать правильно, я бы посоветовал вам использовать форму Events of Symfony.Вот документация .Вам удастся динамически изменить свою форму в зависимости от результата другого поля.

В вашем случае было бы интересно использовать PRE_SET_DATA, это позволит вам изменять форму в зависимости от предварительно заполненных данных (добавлениеили динамическое удаление полей).

И это пример вашей идеи с Form Events

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            // ...
            ->add('roleInCompany', ....)
        ;

        $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function(FormEvent $event) use($factory){
            $data = $event->getData();
            $form = $event->getForm();

            $roleInCompany = $data['roleInCompany'];

           if($roleInCompany === 'supervisor'){
            $form->add('task', 'text', array(
            'required'=> true
            ))
           }

        }
        );
    }
...