Symfony 原则2:UniqueObject验证器如何工作?
我对DoctrineModule(v.0.8.1)中的UniqueObject验证器有问题。它总是返回true或抛出异常 我在数据库中有以下结构:Symfony 原则2:UniqueObject验证器如何工作?,symfony,doctrine-orm,zend-framework2,Symfony,Doctrine Orm,Zend Framework2,我对DoctrineModule(v.0.8.1)中的UniqueObject验证器有问题。它总是返回true或抛出异常 我在数据库中有以下结构: ______________________________________________ | id | user | email | phone | |____|______|__________________|______________| | 1 | 1 | test@test.com |
______________________________________________
| 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
));
这会引发异常:
预期上下文包含id
如果我将使用上下文设置为true
从文件:
如果将“使用上下文”选项设置为true,则必须通过
字段值作为第一个参数和包含
标识符值作为第二个参数转换为isValid()
然后:
始终返回真,即使它不应该返回,这是因为此行返回以下值:
array (size=2)
'email' => string 'email' (length=5)
'user' => string 'user' (length=4)
因此,它将始终返回true,因为没有名为“email”的电子邮件用户
我的问题是:这个验证器到底是怎么工作的?是否有人可以提供此验证器的工作示例和用例?
我只是想用它来更新用户的电子邮件,但看起来我需要找到其他方法来更新。在数据中,您需要包含要检查唯一性的字段,包括标识符字段 我引述: 其次,您必须为实体获得的每个标识符传递一个值 您的标识符列是
id
,因此您还应该发送一个字段id
。您的试用中缺少此字段,因此会显示错误消息
因此,请尝试:
$validator->isValid(array('email' => 'test@test.com', 'id' => '1'));
我敢打赌它会起作用。在数据中,您需要包含要检查唯一性的字段,包括标识符字段 我引述: 其次,您必须为实体获得的每个标识符传递一个值 您的标识符列是
id
,因此您还应该发送一个字段id
。您的试用中缺少此字段,因此会显示错误消息
因此,请尝试:
$validator->isValid(array('email' => 'test@test.com', 'id' => '1'));
我敢打赌它会起作用。您应该将
'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'],
],
],
],
]
]
您应该将
'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'],
],
],
],
]
]
它说它需要一个id,所以试试这个:
$validator->isValid(数组('email'=>)test@test.com“,”id'=>“1”)“代码>我打赌它会起作用。@Wilt是正确的(并且应该添加一个答案)。”。条令中的标识符是用于唯一引用实体的字段,在大多数情况下,您只有一个标识符id
,因此出现错误“预期上下文包含id”,其中id
是您缺少的标识符值。它说它需要一个id,请尝试以下操作:$validator->isValid(数组)('email'=>'test@test.com“,'id'=>'1');
我打赌它会起作用。@Wilt是正确的(并且应该添加一个答案)。条令中的标识符是用于唯一引用实体的字段,在大多数情况下,您只有一个标识符id
,因此出现错误“预期上下文包含id”,其中id
是您缺少的标识符值。在我发布该问题之前,我已尝试使用id
,但在我看来它无法正常工作。或者我不理解这一点。我有实体用户和联系人。这是一对多关系,即一个用户可能有许多不同的电子邮件。使用您的解决方案,它将始终返回true,因为我t的检查记录id
,而它应该检查用户的id@user1409508你不应该改用NoObjectExists
吗?在我发布这个问题之前,我已经尝试了id
,但在我看来它不能正常工作。或者我不理解这一点。我有实体用户和联系人。这是一对多关系,即一个用户可以有许多不同的电子邮件。使用您的解决方案,它将始终返回true,因为它是check recordid
,而它应该检查用户的id@user1409508您是否应该改用NoObjectExists
?