Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 原则2:UniqueObject验证器如何工作?_Symfony_Doctrine Orm_Zend Framework2 - Fatal编程技术网

Symfony 原则2:UniqueObject验证器如何工作?

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 |

我对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
));
这会引发异常:

预期上下文包含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 record
id
,而它应该检查
用户的id@user1409508您是否应该改用
NoObjectExists