ZF2和Doctrine输入过滤器(Unique,ObjectExists)用于具有字段集的新实体和现有实体

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?

Moh*_*din 0

您只需要在“输入过滤器规范”表单中具有如下的 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