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

时间:2016-08-24 19:35:54

标签: php validation symfony doctrine-orm symfony-2.8

我正在创建一个从CSV文件创建用户的应用程序,因此没有表单。 我正在使用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文件返回错误消息。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

  

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

您之前将被迫查找此电子邮件的实体实例,然后将其传递给$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约束通过电子邮件字段验证唯一用户。

相关问题