【发布时间】:2015-08-11 14:09:48
【问题描述】:
我对 DoctrineModule (v. 0.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,您必须 将包含字段和标识符值的数组传递到 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”的用户。
我的问题是:
这个验证器到底是如何工作的?有没有人可以提供这个验证器的工作示例和用例?
我只是想用它来更新用户的电子邮件,但看起来我需要找到其他方法。
【问题讨论】:
-
它说它需要一个 id,所以试试这个:
$validator->isValid(array('email' => 'test@test.com', 'id' => '1'));我敢打赌它会工作。 -
@Wilt 是正确的(应该添加一个答案)。 Doctrine 中的 identifiers 是用于唯一引用实体的字段,在大多数情况下,您只有一个标识符
id因此错误“预期上下文包含 id",其中id是您缺少的标识符值。
标签: symfony doctrine-orm zend-framework2