学说2:UniqueObject验证器如何工作?

时间:2015-08-11 14:09:48

标签: symfony doctrine-orm zend-framework2

我从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'的电子邮件。

我的问题是:
这个验证器到底是怎么回事?有没有人可以提供此验证器的工作示例和用例?

我只想将它用于更新用户的电子邮件,但看起来我需要找到其他方法来实现它。

2 个答案:

答案 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'],
                ],
            ],
        ],
    ]
]