我认为在symfony2 Form
和Validator
组件上创建客户端表单验证将非常有用。
最好的方法是将验证约束传递给表单视图。有了这些信息,就可以制作一个模板,将表单字段呈现为如下内容:
<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';
}
}