Symfony动态表格约束

时间:2016-08-30 23:50:17

标签: symfony

寻找一种直接向我的所有表单字段动态添加约束的方法。到目前为止,我已经想到了使用form type extension,其中有效:我可以修改表单 view 然后手动检查视图表格提交。

但是,是否有更智能的方法可以实时添加基于Symfony的实际约束?

(请注意,当表单根据数据库中的用户配置加载时,需要将约束实时添加到表单中。预定义的表单组等不起作用。)

1 个答案:

答案 0 :(得分:1)

我建议使用表单事件。

使用PRE_SUBMIT事件在验证前编辑表单。

使用$event->getForm()->add(...)添加约束来重新创建字段。

当然,您可以使用添加侦听器的FormExtension自动将侦听器添加到所有表单。

编辑Alsatian67/FormBundle

中的一些示例

您的扩展程序应如下所示:

class ExtensibleExtension extends AbstractTypeExtension
{
    private $extensibleSubscriber;
    public function __construct($extensibleSubscriber) {
        $this->extensibleSubscriber = $extensibleSubscriber;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // Only apply on base form
        if($builder->getForm()->isRoot())
        {
            $builder->addEventSubscriber($this->extensibleSubscriber);
        }
    }

    public function getExtendedType()
    {
        return FormType::class;
    }
}

你的EventListener / EventSubscriber应该迭代所有的孩子:

foreach($event->getForm()->all() as $child){
    $childName = $child->getName();
    $type = get_class($child->getConfig()->getType()->getInnerType());
    $options = $child->getConfig()->getOptions();

    $options['constraints'] = array(/* ... */);

    $form->add($childName,$type,$options);
}