簡體   English   中英

Symfony2根據提交的數據形成驗證組

[英]Symfony2 form validation groups based on submitted data

我有一些復雜的形式,有幾個子表單,我希望能夠根據主窗體中選擇的單選按鈕分別驗證每個子表單。 我希望通過驗證組實現這一目標。

注意:我沒有data_class模型,我使用數組。

這是我簡化的表格:

class MyType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('xxx', 'text', array(
                'constraints' => array(
                    new Constraints\NotBlank(),
                ),
                'validation_groups' => array(
                    'xxx',
                )
            ))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => function(FormInterface $form) {
                return array('xxx');
            },
        ));
    }
}

問題是不會觸發此字段的驗證。

當這工作時,我可以輕松更改setDefaultOptions以根據提交的數據驗證所需的組:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'validation_groups' => function(FormInterface $form) {
            $data = $form->getData();

            return array($data['type']);
        },
    ));
}

任何想法?

您必須將驗證組名稱傳遞給約束,而不是表單本身。 通過將組名稱分配給表單,您可以指定要在驗證中使用的約束。

更換

$builder->add('xxx', 'text', array(
        'constraints' => array(
            new Constraints\NotBlank(),
        ),
        'validation_groups' => array(
            'xxx',
        )
    ))
;

$builder->add('xxx', 'text', array(
        'constraints' => array(
            new Constraints\NotBlank(array(
                'groups' => 'xxx'
            )),
        ),
    ))
;

默認情況下,約束具有“ 默認 ”(大寫)組,並且表單使用此組來驗證是否未指定。 如果您希望其他約束沒有顯式組進行驗證,則指定的組將傳遞“ 默認 ”組。

$resolver->setDefaults(array(
    'validation_groups' => function(FormInterface $form) {
        $data = $form->getData();

        return array($data['type'], 'Default');
    },
));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM