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

Symfony2 how to validate unique email using validator component

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

辅助函数

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 has to be used. It has an associated class called UniqueEntityValidator. The amazing thing is that the Validator Component has a feature that automatically checks the locale and displays the error messages in that language!! (i'm guessing its through the ConstraintViolation 对象 )。我想利用此功能而不是乏味的 findOneBy() 来查询数据库并检查电子邮件是否已经存在并使用(相对)凌乱的 xliff 文件返回错误消息。

所以!问题是如何使用验证器组件的 validator service

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

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

恐怕无法使用 UniqueEntity 及其 UniqueEntityValidator,因为这最后需要一个实体对象作为验证值。否则,会抛出异常:

"get_class() expects parameter 1 to be object, string given"

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

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

编辑:

如果您有用户实例,那么您不需要设置约束来在您的 csverror 函数中验证它。在实体 User class:

中配置断言约束
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 约束通过电子邮件字段验证唯一用户。