我正在创建一个从CSV文件创建用户的应用程序,因此没有Forms。我使用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文件返回错误消息。
如此!问题是如何使用验证器组件的验证器服务
来验证数据库中唯一的电子邮件编辑:在上面的代码$associativerow['email']
是一个字符串,但在实践中,我可以把它作为一个User
对象,如果需要的话,你可以自由地假设它是一个实体对象!
恐怕这是不可能使用UniqueEntity
和它的UniqueEntityValidator
,因为这最后需要一个实体对象作为值来验证。否则,将抛出异常:
"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);
// ...
}
,
$user = new User();
$user->setEmail($associativerow['email']);
// ...
$this->csverror($user, $rowcount);
现在,UniqueEntity
约束通过email字段验证唯一用户