简单恢复密码表单

时间:2013-12-28 19:00:03

标签: forms symfony dependencies constraints

再次,我正在尝试一个简单的表单来恢复忘记用户密码。

表单只包含电子邮件输入。表单处理程序,接收电子邮件,搜索用户,还原密码并使用新密码发送电子邮件。重要的是说用户未经过身份验证。

所以,我需要创建一个自定义约束来检查数据库中是否存在电子邮件。我有一个自己的服务方法来做到这一点。所以,我需要用约束绑定方法。

自定义验证类是:

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()
                )
            ));
}

1 个答案:

答案 0 :(得分:2)

替换,

public function validatedBy()
{
    return get_class($this).'Validator';
}   

在您的ExistEmail约束类中,

public function validatedBy()
{
    return 'user_email_validator';
}

以便将约束映射到ExistEmailValidator的正确实例(在服务容器中实例化的实例)。