在Symfony2中创建客户端和服务器端组合验证


Create combined client side and server side validation in Symfony2

我认为在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属性的<input>元素,并为它们创建正确的验证。

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

目前我的表单类型扩展看起来像这样:

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对象?

检查相应的开放问题"[Form] JavaScript validation",其中包含对simplethingsformextrabundance(或者更确切地说,是该bundle的一个特定的开放PR)的引用,

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

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

FieldType已经将attr属性传递给表单,该属性直接作为attr var传递给view。您最好修改这个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';
    }
}