Symfony2如何使用验证器组件验证唯一的电子邮件


Symfony2 how to validate unique email using validator component

我正在创建一个从CSV文件创建用户的应用程序,因此没有Forms。我使用symfony验证器组件来验证控制器中的数据。到目前为止,我创建了一个辅助函数,它接受数据和约束,并返回错误(如果有的话)。这就是我的意思

辅助函数

public function csverror($value, $constraint, $rowcount, $columnname){
    $error = $this->container->get('validator')->validate($value, $constraint);
    if(count($error) !== 0){
        $this->get('session')->getFlashBag()->add('csverror', "error on line: $rowcount column: $columnname ". $error[0]->getMessage());
    }
}

并在控制器中调用它

$this->csverror($associativerow['email'],  array(new NotBlank(), new Length(['max' => 100]), new Email()), $rowcount, "email");

这里我需要检查在CSV中指定的电子邮件是否已经存在于数据库中,为此我假设必须使用UniqueEntity。它有一个关联的类叫做UniqueEntityValidator。令人惊奇的是,Validator组件有一个特性,即自动检查语言环境并以该语言显示错误消息!!(我猜它通过ConstraintViolation对象)。我想利用这个功能,而不是平淡的findOneBy()来查询数据库,检查电子邮件是否已经存在,并使用(相对)混乱的xliff文件返回错误消息。

如此!问题是如何使用验证器组件的验证器服务

来验证数据库中唯一的电子邮件

编辑:在上面的代码$associativerow['email']是一个字符串,但在实践中,我可以把它作为一个User对象,如果需要的话,你可以自由地假设它是一个实体对象!

恐怕这是不可能使用UniqueEntity和它的UniqueEntityValidator,因为这最后需要一个实体对象作为值来验证。否则,将抛出异常:

"get_class()期望参数1为对象,字符串给定"

您将被迫找到此电子邮件的实体实例,然后将其传递给$this->csverror(...)方法:

$object = $this->getDoctrine()->getRepository('AppBundle:User')->findOneBy(['email' => $associativerow['email']]);
$this->csverror($object, new UniqueEntity(...));
编辑:

如果你有用户实例,那么你不需要设置约束来验证它在你的csverror函数。在实体用户类中配置断言约束:

use Symfony'Component'Validator'Constraints as Assert;
/**
 * ...
 * @UniqueEntity(fields={"email"}
 */
class User 
{
    //...
    /**
     * @var string
     * 
     * @Assert'NotBlank()
     * @Assert'Length(max="100")
     *
     * @ORM'Column(type="string")
     */
    private $email;
    //...
}

之后,

public function csverror($object, $rowcount){
    $error = $this->container->get('validator')->validate($object);
    // ...
}

,

$user = new User();
$user->setEmail($associativerow['email']);
// ...
$this->csverror($user, $rowcount);

现在,UniqueEntity约束通过email字段验证唯一用户