Php Symfony2如何使用验证程序组件验证唯一电子邮件

Php Symfony2如何使用验证程序组件验证唯一电子邮件,php,validation,symfony,doctrine-orm,symfony-2.8,Php,Validation,Symfony,Doctrine Orm,Symfony 2.8,我正在创建一个从CSV文件创建用户的应用程序,因此没有表单我正在使用symfony验证程序组件验证控制器中的数据。到目前为止,我创建了一个helper函数,它接收数据和约束,并返回错误(如果有)。这就是我的意思 辅助函数 public function csverror($value, $constraint, $rowcount, $columnname){ $error = $this->container->get('validator')->validate($

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

辅助函数

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中指定的电子邮件是否已经存在于数据库中,因为这个im假设必须使用。它有一个名为的关联类。令人惊奇的是,验证器组件有一个功能,自动检查区域设置并用该语言显示错误消息!!(我通过物体猜到了)。我想使用此功能而不是乏味的
findOneBy()
来查询数据库,检查电子邮件是否已经存在,并使用(相对)凌乱的xliff文件返回错误消息

所以!问题是如何使用validator组件的


编辑:在上面的代码中,
$associateverow['email']
是一个字符串,但在实践中,如果需要,我可以将其作为
用户
对象,如果需要,您可以自由地将其假定为实体对象

恐怕这不可能使用
uniquentity
及其
uniquentityvalidator
,因为这最后需要实体对象作为值进行验证。否则,将引发异常:

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);
    // ...
}
以及


现在,
uniquentity
约束通过电子邮件验证唯一用户字段。

使用约束将答案更新到模型类中。
$user = new User();
$user->setEmail($associativerow['email']);
// ...

$this->csverror($user, $rowcount);