ZF2休息服务/学说验证

时间:2012-07-24 13:38:50

标签: validation zend-framework2

我正在努力寻找在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吗?或者我应该进入注释方向吗?

1 个答案:

答案 0 :(得分: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());

由于我刚刚开始需要应用自定义验证规则,并期望这些规则随着时间的推移而变得更加复杂,甚至可能是有条件的,我希望我会将我的表单生成器移出控制器并进入楷模。原因是,当/如果我开始定义有条件的验证规则时,该逻辑在其所属的模型中。这也将清理Controller动作,因为所有表单组件都变成了黑盒方法。

示例:

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

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

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

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