再次,我正在尝试一个简单的表单来恢复忘记用户密码。
表单只包含电子邮件输入。表单处理程序,接收电子邮件,搜索用户,还原密码并使用新密码发送电子邮件。重要的是说用户未经过身份验证。
所以,我需要创建一个自定义约束来检查数据库中是否存在电子邮件。我有一个自己的服务方法来做到这一点。所以,我需要用约束绑定方法。
自定义验证类是:
class ExistEmailValidator extends ConstraintValidator
{
protected $userService;
public function setUserService($userService)
{
echo "Setter...";
var_dump($userService);
die();
$this->userService = $userService;
}
public function validate($value, Constraint $constraint)
{
if($this->userService->existUserEmail($value) == false){
$this->context->addViolation($constraint->message, array('%string%' => $value));
}
}
}
我从services.yml注入服务:
validator.unique.ExistEmailValidator:
class: AppsManantiales\CommonBundle\Validator\Constraints\ExistEmailValidator
tags:
- {name: validator.constraint_validator, alias: user_email_validator}
calls:
- [setUserService, ["userservice"]]
问题是,从不注入服务,因为Symfony说:
错误:在非对象
上调用成员函数existUserEmail()
注意:用户服务ID为:“userservice”。
php app/console container:debug | grep UserService
userservice container AppsManantiales\CommonBundle\Services\UserService
有什么想法吗?
更新1
我的约束类是:
class ExistEmail extends Constraint{
public $message = 'El e-mail "%string%" no pertenece a ningun usuario del sistema.';
public function validatedBy()
{
return get_class($this).'Validator';
}
}
表单定义为:
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('anUserEmail', 'email',
array(
'constraints' => array(
new ExistEmail()
)
));
}
答案 0 :(得分:2)
替换,
public function validatedBy()
{
return get_class($this).'Validator';
}
在您的ExistEmail
约束类中,
public function validatedBy()
{
return 'user_email_validator';
}
以便将约束映射到ExistEmailValidator
的正确实例(在服务容器中实例化的实例)。