Dai*_*mos 5 php doctrine-orm zend-framework2
我学习学说,我有一个表格.ZF2和学说与字段"电子邮件".这个字段必须是唯一的,所以我需要验证器.我也使用了字段集(这里很重要).问题是,当我使用时:
DoctrineModule\Validator\UniqueObject
Run Code Online (Sandbox Code Playgroud)
创建新实体是不可能的.此验证器需要主键进行比较.验证器转储错误消息:
包含itemId的预期上下文
itemId是我的主键.
显而易见,我需要使用UniqueObject进行更新,并且:
DoctrineModule\Validator\NoObjectExists
Run Code Online (Sandbox Code Playgroud)
对于新实体.问题是:
为现有实体和新实体存储不同的输入过滤器规范的最佳方法是什么?
或者,如果可能的话,更好:如何使用具有zend表单字段集的新记录和现有记录的唯一验证程序.
如果我把它放在表单中,我需要在控制器内修改它,如果实体是新的或没有.不太好主意.
我认为最好的方法是存储输入过滤规范.在实体存储库内部,但我如何检查实体是否是新的?
----编辑
我看到文档,我知道如何使用唯一对象但我有如前所述的错误:"包含itemId的预期上下文".我认为问题在于字段集(即时使用它).我不明白该怎么做(文档中的文字):
如果省略use_context选项或将其设置为false,则必须将包含fields-和identifier-values的数组传递给isValid().使用Zend\Form时,如果您正在使用fieldsets,则需要此行为 .
好吧我使用现场集,所以现在我能做什么?我在使用zend表单时如何将正确的值传递给isValid?
您只需要在“输入过滤器规范”表单中具有如下的 UniqueObject 验证器:
'email' => array(
'validators' => array(
array(
'name' => 'DoctrineModule\Validator\UniqueObject',
'options' => array(
'use_context' => true,
'object_repository' => $this->objectManager->getRepository('Namespace\EntityName'),
'object_manager' => $this->objectManager,
'fields' => 'email',
'messages' => array(
'objectNotUnique' => 'Email already exists!'
),
),
)
),
),
Run Code Online (Sandbox Code Playgroud)
您可以从此链接找到更多详细信息: https://github.com/doctrine/DoctrineModule/blob/master/docs/validator.md