我从DoctrineModule(v.8.8.1)的UniqueObject验证器出了问题。它总是返回true或抛出异常。
我在数据库中有以下结构:
______________________________________________
| id | user | email | phone |
|____|______|__________________|______________|
| 1 | 1 | test@test.com | 123456789 |
|____|______|__________________|______________|
| 2 | 2 | 0test@test.com | 123456789 |
|____|______|__________________|______________|
我的代码:
$em = $this->getServiceLocator()->get('Doctrine\ORM\Entitymanager');
$validator = new \DoctrineModule\Validator\UniqueObject(array(
'object_manager' => $em,
'object_repository' => $em->getRepository('Application\Entity\User'),
'fields' => array('email', 'user'),
'use_context' => false // <--- I also tried with true
));
来自文档:
如果省略use_context选项或将其设置为 false ,则必须这样做 将包含fields-和identifier-values的数组传递给 isValid()的
所以,我跑:
$validator->isValid(array('email' => 'test@test.com', 'user' => '1'));
引发异常:
包含id的预期上下文
如果我将 use_context 设置为 true
来自文档:
如果将use_context选项设置为 true ,则必须通过 fields-values作为第一个参数和一个包含的数组 标识符值作为第二个参数进入isValid()
然后:
$validator->isValid(array('email', 'user'), array('test@test.com', '1'));
始终返回 true ,即使它不应该,也就是说,这是因为此行https://github.com/doctrine/DoctrineModule/blob/master/src/DoctrineModule/Validator/UniqueObject.php#L107返回以下值:
array (size=2)
'email' => string 'email' (length=5)
'user' => string 'user' (length=4)
所以它总会返回true,因为没有用户使用名为'email'的电子邮件。
我的问题是:
这个验证器到底是怎么回事?有没有人可以提供此验证器的工作示例和用例?
我只想将它用于更新用户的电子邮件,但看起来我需要找到其他方法来实现它。
答案 0 :(得分:0)
在您的数据中,您需要包含要检查唯一性的字段,包括标识符字段。
我引用straight from the documentation:
其次,你必须为你的实体获得的每个标识符传递一个值。
您的标识符列为id
,因此您还应发送字段id
。您的试验中缺少此字段,因此出现错误消息。
所以试试:
$validator->isValid(array('email' => 'test@test.com', 'id' => '1'));
我敢打赌它适用。
答案 1 :(得分:0)
您应该设置'use_context' => true
并将仅一个字段应用于'fields' => ['email']
(如果需要,可以省略数组)。验证程序可以在此组合中正常工作。
我在ZF3中的验证配置:
[
'email' => [
'required' => true,
'name' => 'email',
'validators' => [
[
'name' => \DoctrineModule\Validator\UniqueObject::class,
'options' => [
'object_manager' => $om = $this->getObjectManager(),
'object_repository' => $om->getRepository(User::class),
'target_class' => User::class,
'use_context' => true,
'fields' => ['email'],
],
],
],
]
]