Symfony 动态表单约束

nur*_*abe 3 symfony

寻找一种简单的方法来动态添加约束到我的所有表单字段。到目前为止,我想到了使用表单类型扩展的想法,这种方法很有效:我可以修改表单视图,然后手动检查表单提交时的视图。

然而,是否有更智能的方法来实时添加真正的基于 Symfony 的约束?

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

Als*_*ian 5

我建议使用表单事件。

使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并且您的 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);
}
Run Code Online (Sandbox Code Playgroud)