Symfony验证字段(如果其他字段具有特定值)

时间:2019-02-11 13:51:26

标签: symfony assert

代码示例:

$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 :(得分:1)

为了正确地做某事,我建议您使用Symfony的事件表。这是documentation。您将设法根据另一个字段的结果动态更改表单。

对于您而言,使用PRE_SET_DATA会很有趣,它将允许您根据预先填充的数据(动态添加或删除字段)来修改表单。

这是您对表单事件的想法的一个例证

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
            ))
           }

        }
        );
    }