我有一个password
表单字段(不映射到User
密码)以用于更改密码表单,以及另外两个(映射的)字段, first
和last
。
我要动态添加验证器:如果密码的值为空,则不应进行验证。否则,应添加新的 MinLength
和MaxLength
验证工具。
以下是我到目前为止所做的事情:如果password
为CallbackValidator
,则创建重复的return
字段,添加$form->getData()
和null
。< / p>
那么,如何将最小和最大长度的验证器添加到$ field?
$builder = $this->createFormBuilder($user);
$field = $builder->create('new_password', 'repeated', array(
'type' => 'password',
'first_name' => 'Password',
'second_name' => 'Confirm password',
'required' => false,
'property_path' => false // Not mapped to the entity password
));
// Add a callback validator the the password field
$field->addValidator(new Form\CallbackValidator(function($form) {
$data = $form->getData();
if(is_null($data)) return; // Field is blank
// Here password is provided and match confirm, check min = 3 max = 10
}));
// Add fields to the form
$form = $builder
->add('first', 'text', array('required' => false)) // Mapped
->add('last', 'text', array('required' => false)) // Mapped
->add($field) // Not mapped
->getForm();
答案 0 :(得分:9)
哦,经过几次实验后,我自己找到了一个解决方案。
我将在几天内回答这个问题,因为可以发布更好的解决方案,这真的非常受欢迎:)
特别是,我发现new FormError
部分是冗余的,不知道是否有更好的方法将错误添加到表单中。老实说,不知道为什么new Form\CallbackValidator
有效,而new CallbackValidator
则不然。
所以,不要忘记添加use
这样的语句:
use Symfony\Component\Form as Form, // Mendatory
Symfony\Component\Form\FormInterface,
Symfony\Component\Validator\Constraints\MinLength,
Symfony\Component\Validator\Constraints\MinLengthValidator;
回调是:
$validation = function(FormInterface $form) {
// If $data is null then the field was blank, do nothing more
if(is_null($data = $form->getData())) return;
// Create a new MinLengthValidator
$validator = new MinLengthValidator();
// If $data is invalid against the MinLength constraint add the error
if(!$validator->isValid($data, new MinLength(array('limit' => 3)))) :
$template = $validator->getMessageTemplate(); // Default error msg
$parameters = $validator->getMessageParameters(); // Default parameters
// Add the error to the form (to the field "password")
$form->addError(new Form\FormError($template, $parameters));
endif;
};
嗯,这是我无法理解的部分(为什么我被迫用Form
作为前缀),但没关系:
$builder->get('password')->addValidator(new Form\CallbackValidator($validation));
答案 1 :(得分:5)
addValidator
已被弃用并完全删除。
您可以通过收听POST_SUBMIT
事件
$builder->addEventListener(FormEvents::POST_SUBMIT, function ($event) {
$data = $event->getData();
$form = $event->getForm();
if (null === $data) {
return;
}
if ("Your logic here") {
$form->get('new_password')->addError(new FormError());
}
});