Php Symfony2如何使用验证程序组件验证唯一电子邮件
我正在创建一个从CSV文件创建用户的应用程序,因此没有表单我正在使用symfony验证程序组件验证控制器中的数据。到目前为止,我创建了一个helper函数,它接收数据和约束,并返回错误(如果有)。这就是我的意思 辅助函数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($
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);