草庐IT

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

coder 2024-04-05 原文

我在学习教义,我有一个表格。 ZF2 和带有字段“电子邮件”的学说。 这个字段需要是唯一的,所以我需要它的验证器。我也在使用字段集(这在这里很重要)。问题是,当我使用时:

DoctrineModule\Validator\UniqueObject

不可能创建新实体。该验证器需要主键进行比较。 验证器转储错误消息:

Expected context to contain itemId

itemId 是我的主键。

很明显,我需要使用 UniqueObject 进行更新,并且:

DoctrineModule\Validator\NoObjectExists

对于新实体。问题是:

为现有实体和新实体存储不同输入过滤器规范的最佳方法是什么?

或者,如果可能的话更好:How to use Unique validator with new, and existing records with zend form fieldsets。

如果我把它放在表单中,如果实体是新的或不是,我需要在 Controller 内部修改它。不是什么好主意。

我认为最好的方法是存储输入过滤器规范。在实体存储库中,但是我如何检查实体是否是新的?

----编辑

我看过文档,我知道如何使用唯一对象,但我遇到了如前所述的错误:“预期上下文包含 itemId”。我认为问题出在字段集上(我正在使用它)。我不明白该怎么做(文档中的文本):

If you leave out the use_context option or set it to false you have to pass an array containing the fields- and identifier-values into isValid(). When using Zend\Form this behaviour is needed if you're using fieldsets.

好的,我正在使用字段集,那么现在我能做什么?我如何在使用 zend 表单时将正确的值传递给 isValid?

最佳答案

使用 UniqueObject 验证器,您需要在上下文中包含标识符字段。所以它只有在 email 列是您的 Email 实体的标识符列时才有效?您有一个额外的 id 列。最好在您的用户案例中使用 NoObjectExists 验证器:

'email' => array(
    'validators' => array(
        array(
            'name' => 'DoctrineModule\Validator\NoObjectExists',
            'options' => array(
                'object_repository' => $entityManager->getRepository(
                    'Application\Entity\Email'
                ),
                'fields' => 'email'
            )
        )
    )
)

你也可以找到这个例子in the documentation .

编辑

关于分离更新和新输入过滤器的逻辑,我建议创建两个文件夹。最好像那样严格分开,否则很可能会出错。例如,您可以这样做(但这完全取决于您个人的喜好,这是如何组织的)。

Application/InputFilter/Create
    UserInputFilter

还有一个用于更新资源:

Application/InputFilter/Update
    UserInputFilter

然后在你的 Controller 中你可以这样做:

<?php

namespace Application\Controller;

use Application\InputFilter\Create;
use Application\InputFilter\Update;

class UserController{

    public function updateAction()
    {
        $inputFilter = new Update\UserInputFilter();
        //... etc
    }

    public function createAction()
    {
        $inputFilter = new Create\UserInputFilter();
        //... etc
    }
}

关于php - ZF2 和 Doctrine 输入过滤器(Unique,ObjectExists),用于具有字段集的新实体和现有实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33452154/

有关php - ZF2 和 Doctrine 输入过滤器(Unique,ObjectExists),用于具有字段集的新实体和现有实体的更多相关文章

  1. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  2. ruby-on-rails - 在 Controller 中干净地处理多个过滤器(参数) - 2

    我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告

  3. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  4. ruby-on-rails - Rails 3 - 过滤器链暂停为 :authentication rendered or redirected - 2

    我仍然收到标题中的“错误”消息,但不知道如何解决。在ApplicationController中,classApplicationController在routes.rb#match'set_activity_account/:id/:value'=>'users#account_activity',:as=>:set_activity_account--thisdoesn'tworkaswell..resources:usersdomemberdoget:action_a,:action_bendcollectiondoget'account_activity'endend和User

  5. ruby-on-rails - ActiveAdmin 自定义选择过滤器下拉名称 - 2

    对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking

  6. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  7. ruby - 液体模板贴图过滤器 - 2

    究竟如何使用Liquid中的map过滤器?我在Jekyll中使用它。---my_array:[apple,banana,orage]my_map:hello:worldfoo:barmy_string:"howdoesthiswork?"---{{page.my_map|map...}}这就是我迷路的地方。我似乎无法在文档或任何其他在线网站上找到任何关于它的用法示例。顺便说一下,我还不懂Ruby,所以sourcecode我也不清楚。来自filtertests看起来下面应该产生一些东西,但在GitHub上,我什么也没得到:{{site.posts|map:'title'|array_to

  8. Spring Security 6.0系列【32】授权服务器篇之默认过滤器 - 2

    有道无术,术尚可求,有术无道,止于术。本系列SpringBoot版本3.0.4本系列SpringSecurity版本6.0.2本系列SpringAuthorizationServer版本1.0.2源码地址:https://gitee.com/pearl-organization/study-spring-security-demo文章目录前言1.OAuth2AuthorizationServerMetadataEndpointFilter2.OAuth2AuthorizationEndpointFilter3.OidcProviderConfigurationEndpointFilter4.N

  9. ruby-on-rails - 如果字段不为零,则葡萄实体有条件地公开 - 2

    在一个葡萄实体中,我只想在没有运气的情况下显示一个字段(不是零?)。我正在尝试这段代码,但根本没有按预期工作,但总是隐藏该字段。expose:winner,:using=>PlayerEntity,:unless=>{:winner=>nil}我认为代码本身解释了我真正需要的东西,但正如我所说,我没有得到预期的结果。有什么线索吗? 最佳答案 好的,检查grape-entity的代码我发现你需要将这个block作为RubyProc传递。此代码将按预期工作:expose:winner,:using=>PlayerEntity,:unle

  10. ruby - 如何从定义相同名称的模块内部访问ruby中的顶级实体 - 2

    在一个模块中,我有一个名为Process的类。moduleMProcess=Class.newProcess::wait(0)end这会引发NoMethodError。如何从模块内部访问顶级Process?如果不重命名我的类(class),这完全有可能吗? 最佳答案 ::Process.wait(0) 关于ruby-如何从定义相同名称的模块内部访问ruby中的顶级实体,我们在StackOverflow上找到一个类似的问题: https://stackoverf

随机推荐