symfony2断言继承

时间:2013-02-28 02:00:13

标签: validation symfony

我正在使用Symfony2 我有两个班级:employeephysiciandoctoremployee的子类。

实体employee

@UniqueEntity(fields={"email"}, message="Este valor ya se ha utilizado.")

当我的独特实体有效电子邮件字段仅针对员工和医生单独验证时。

如果我插入employee3 mail1@mail.com错误断言symfony2工作正常 如果我插入doctor2 mail3@mail.com错误断言symfony2工作正常 如果我插入doctor2 mail1@mail.com显示错误sql但没有错误断言symfony2。

1 个答案:

答案 0 :(得分:0)

以下是UniqueEntityValidator类的一部分:

$repository = $em->getRepository($className);
$result = $repository->{$constraint->repositoryMethod}($criteria);

/* If the result is a MongoCursor, it must be advanced to the first
 * element. Rewinding should have no ill effect if $result is another
 * iterator implementation.
 */
if ($result instanceof \Iterator) {
    $result->rewind();
}

/* If no entity matched the query criteria or a single entity matched,
 * which is the same as the entity being validated, the criteria is
 * unique.
 */
if (0 === count($result) || (1 === count($result) && $entity === 
    ($result instanceof \Iterator ? $result->current() : current($result)))) {
    return;
}

如您所见,$em->getRepository($className)将用作存储库。问题在于,如果没有repositoryMethod选项,Symfony将使用Doctrine的findBy方法,该方法可在每个存储库中使用,甚至可以使用从EntityRepository继承的自定义方法。

当您的实体为Employee时,Symfony将仅在员工中寻找具有给定字段的现有实体

$em->getRepository('AcmeHelloBundle:Employee')->findBy($criteria);

当实体为Physician时,同样的情况也会发生(只在医生中看):

$em->getRepository('AcmeHelloBundle:Physician')->findBy($criteria);

引述你:

  

如果我插入employee3 mail1@mail.com错误断言symfony2工作正常

那是因为没有员工使用电子邮件mail1@mail.com

  

如果我插入doctor2 mail3@mail.com错误断言symfony2工作正常

出于与上述相同的原因。

  

如果我插入doctor2 mail1@mail.com显示错误sql但没有错误断言   Symfony2的

这是问题所在!没有医生用mail1@mail.com发送电子邮件!有一位员工使用相同的电子邮件,但在对医生存储库使用findBy时,会返回0

也许您应该将repositoryMethod选项设置为存储库方法,在使用数组作为条件进行搜索时会查找employeephysician