我正在努力寻找在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吗?或者我应该进入注释方向吗?
答案 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());
因此,我认为您是否使用注释来定义默认输入规则并不重要。无论您最初如何定义它们,都将根据业务逻辑修改它们。
在我看来,您可能会受益于将表单程序集移动到模型类中,以实现保持验证规则与实体完全分离的目标。我相信你的直觉是正确的,业务逻辑需要留在模型中,而不是在控制器或实体中。