时,该代码片段将自动调用回调方法
我是这个Symfony
框架的新手,在实现过程中遇到了死胡同。只有当输入了用户的current password
时,我才需要验证new password
和confirm password
字段。
我尽力通过这些链接来理解这个概念,
- http://shout.setfive.com/2013/06/27/symfony2-forms-without-an-entity-and-with-a-conditional-validator/
- 基于Symfony 2中的字段A或字段B验证表单字段A
- http://tomislavsantek.iz.hr/2011/03/using-symfony-postvalidator/
但事实证明,要么使用的类被弃用,要么需要一个实体。
两个领域的实现如下,
//if this field is filled
$builder->add('currentPassword', 'password', array('label'=>'Current Password',
'required'=>false,
'attr'=>array('class'=>'form-control'),
'error_bubbling' => true,
'trim' => true,
'mapped' => false,
'label_attr'=>array('class'=>'col-sm-4 control-label')));
//These repeated fields must be filled or must be set as required
$builder->add( 'password', 'repeated', array( 'type' => 'password',
'required' => false,
'invalid_message' => ErrorMessages::PASSWORDS_DO_NOT_MATCH,
'options' => array('attr' => array('class' => 'password-field form-control')),
'first_options' => array('label' => false,
'error_bubbling' => true,
'label_attr'=>array('class'=>'col-sm-4 control-label')),
'second_options' => array('label' => false,
'label_attr'=>array('class'=>'col-sm-4 control-label'))));
我在控制器中使用了一组if
条件来实现验证,但如果能学习到在这种情况下执行验证的正确方法,那就太好了。:)
谢谢
编辑
用户entity
<?php
namespace ProjBundleAccountsBundleEntity;
use SymfonyComponentValidatorConstraints as Assert;
use SymfonyComponentSecurityCoreUserUserInterface;
use ProjBundleAccountsBundleCustomErrorMessages;
class User implements UserInterface, Serializable {
/**
* @AssertEmail(message=ErrorMessages::EMAIL_ADDRESS_INVALID)
* @AssertNotBlank(message=ErrorMessages::EMAIL_ADDRESS_EMPTY)
*/
private $email;
/**
* @AssertNotBlank(message=ErrorMessages::PASSWORD_EMPTY, groups={"full"})
*/
private $password;
private $oldPassword;
private $id;
private $userId;
private $name;
private $username;
public function __construct() {
}
function setEmail ($email) {
$this->email = $email;
$this->username = $email;
}
function getEmail () {
return $this->email;
}
function setPassword ($password) {
$this->password = $password;
}
function getPassword () {
return $this->password;
}
function setOldPassword ($oldPassword) {
$this->oldPassword = $oldPassword;
}
function getOldPassword () {
return $this->oldPassword;
}
function setId ($id) {
$this->id = $id;
}
function getId () {
return $this->id;
}
function setUserId ($userId) {
$this->userId = $userId;
}
function getUserId () {
return $this->userId;
}
function setName (PersonName $name) {
$this->name = $name;
}
function getName () {
return $this->name;
}
public function eraseCredentials() {
}
public function getRoles() {
return array('ROLE_USER');
}
public function getSalt() {
}
public function getUsername() {
return $this->username;
}
}
如下修改您的类
use SymfonyComponentValidatorConstraints as Assert;
use SymfonyComponentValidatorExecutionContext;
/**
*
* @AssertCallback(methods={"passwordVerify"})
*/
class User implements UserInterface, Serializable {
//all your old code here
public function passwordVerify(ExecutionContext $context)
{
//your controls about password fields here
//in case of failure you can add that snippet of code
$context->addViolationAtPath($propertyPath,'your message here', array(), null);
}
}
当然,你必须能够访问passwordVerify
函数中的所有信息,最快的方法是在实体中创建字段verifyPassword
,这样当你将表单与实体绑定时,所有数据都会在那里。
当您使用isValid()
表单的方法