【问题标题】:Create combined client side and server side validation in Symfony2在 Symfony2 中创建组合的客户端和服务器端验证
【发布时间】:2011-12-22 20:40:36
【问题描述】:

我认为在 symfony2 FormValidator 组件上创建客户端表单验证非常有用。

最好的方法是将验证约束传递给表单视图。 有了这些信息,就可以制作一个将表单字段呈现为如下内容的模板:

<div>
    <label for="form_email">E-Mail</label>
    <input 
        id="form_email" type="text" name="form[email]" value=""
        data-validation-constraints='{"NotBlank":{},"MinLength":{"limit":6}}'
    />
</div>

然后,JavaScript 部分将查找所有具有 data-validation-constraints 属性的 &lt;input&gt; 元素并为它们创建正确的验证。

要将验证约束传递给表单视图,我认为最好的方法是创建表单类型扩展。这就是我的问题的重点:这是正确的方法吗?这怎么可能?

目前我的表单类型扩展如下所示:

use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormBuilder;

class FieldTypeExtension extends \Symfony\Component\Form\AbstractTypeExtension{

    public function getExtendedType(){
        return 'field';
    }

    public function buildView(FormView $view, FormInterface $form)
    {
        // at this point i didn't find a way to get the 
        // validation constraints out of the $form
        // the `getAllValidationConstraints` here is just an example
        $view->set('validation_constraints', $form->getAllValidationConstraints());
    }

}

如何从 FormInterface 对象中获取应用于一个表单字段的所有验证约束?

【问题讨论】:

  • @alessandro1997 这个捆绑包试图解决我描述的同样的问题,但是以一种非常不同的方式。它目前仅适用于实体注释中定义的约束。我想得到所有的约束,不管它们来自哪里。我想使用与isValid 方法相同的机制来查找约束。

标签: php symfony validation symfony-forms


【解决方案1】:

这是一个新的 Symfony 2 包,它将表单类型约束转换为 JavaScript 验证标尺https://github.com/formapro/JsFormValidatorBundle

【讨论】:

    【解决方案2】:

    检查相应的未解决问题 "[Form] JavaScript validation",其中包含对执行此操作的 SimpleThingsFormExtraBundle(或者更确切地说是该捆绑包的特定开放 PR)的引用。

    【讨论】:

      【解决方案3】:

      你可以做一些更简单的事情:

      FieldType 已经将 attr 属性传递给表单,该属性直接作为 attr var 传递给查看。您最好修改此 attr 表单的属性以添加您的 data-validation-constraints 属性,因为这样可以避免您还需要自定义要处理的表单主题你的新变量。

      <?php
      
      namespace MyBundle\Form\Type;
      
      use Symfony\Component\Form\AbstractTypeExtension;
      use Symfony\Component\Form\FormBuilder;
      
      class FieldTypeJsValidationExtension extends AbstractTypeExtension
      {
          public function buildForm(FormBuilder $builder, array $options)
          {
              $attr = $builder->getAttribute('attr');
              $attr = array_merge(
                  array(
                      'data-validation-constraints' => $this->aMethodThatRenderTheFinalContentOfTheValidationAttribute(),
                  ),
                  $builder->getAttribute('attr')
              );
      
              $builder->setAttribute('attr', $attr);
          }
      
          public function getExtendedType()
          {
              return 'field';
          }
      
      }
      

      【讨论】:

      • 您正在使用 buildForm 方法。此时您没有对 FormInterface 对象的引用。我想我需要引用这个对象来获取当前表单字段的所有约束。但我不确定......我的问题是如何从 FormInterface 对象中将所有验证约束应用于一个表单字段
      猜你喜欢
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 2011-10-17
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多