我正在创建一个从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
对象,如果有必要,你可以自由地假设它是一个实体对象,如果需要的话!
答案 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
约束通过电子邮件字段验证唯一用户。