1

我正在努力寻找在 ZF2 Rest Service 中验证 Doctrine 2 实体的最佳方法。我最初通过扩展 Zend\InputFilter\InputFilter 来实现验证,并将验证器附加到扩展类中的过滤器。我不确定这是不是最好的方法,因为我的验证与我的实体类完全分开。

我考虑过使用 Matthew 的文章http://mwop.net/blog/2012-07-02-zf2-beta5-forms.html中描述的注释来实现我的验证,但是在实例化实体时,我经常在构造函数中有参数,在我看来,这不适用于这种方法。

此外,根据实体的状态,我的实体通常具有不同的验证规则。例如,如果我有一个 BlogPost 实体,并且它处于“草稿”状态,我可能只需要字段的一个子集。如果它处于“已发布”状态,那么我可能需要所有字段。

关于在这里采取的最佳方法有什么想法吗?由于这是一个 REST 实现,我不需要 Zend\Form 提供的任何视觉效果。我应该继续扩展\Zend\InputFilter\InputFilter 的方法吗?还是我应该朝注释方向走?

4

1 回答 1

0

注释很棒,我们将它们与代码生成一起使用,以便我们可以根据 Doctrine EntityManger 返回的模式属性定义表单元素行为。我希望注解能将更多的实体定义放在一个地方并使它们更易于管理,到目前为止,这是真的。

话虽如此,我发现注释有点不灵活,因为注释分配的属性不能被子类中的其他注释覆盖。

在运行时用注解覆盖属性集很容易,但是你不能用更多的注解来做到这一点。(可能是在说显而易见的。)

所以我目前正在我的控制器操作中进行覆盖。

例子:

    $builder = new AnnotationBuilder();
    $form = $builder->createForm($myEntity);

    // customize the the InputFilter for myElement
    $form->getInputFilter()->get('myElement')->setAllowEmpty(FALSE);
    $form->getInputFilter()->get('myElement')->setRequired(TRUE);
    $form->getInputFilter()->get('myElement')->getValidatorChain()->addValidator(new \Zend\Validator\NotEmpty('all'));

    // carry on with the form as normal
    $form->setData($this->getRequest()->getQuery());

由于我才刚刚开始需要应用自定义验证规则,并且预计这些规则会随着时间的推移变得更加复杂,甚至可能是有条件的,因此我希望我希望将表单构建器从控制器中移到模型中。原因是,当/如果我开始定义有条件的验证规则时,该逻辑在它所属的模型中。这也将清理控制器操作,因为所有表单组件都变成了黑盒方法。

例子:

    $form = $myEntityModel->buildForm($myEntity);

    // carry on with the form as normal
    $form->setData($this->getRequest()->getQuery());

所以我认为你是否使用注释来定义你的默认输入规则并不重要。无论您最初如何定义它们,您都将根据业务逻辑修改它们。

在我看来,您可能会受益于将表单组装移动到模型类中以实现将验证规则与实体完全分离的目标。我相信您的直觉是正确的,业务逻辑需要保留在模型中,而不是控制器或实体中。

于 2012-11-10T01:19:24.703 回答