2012-07-24 56 views
1

我正在努力验证ZF2休息服务中的Doctrine 2实体的最佳方式。我最初通过扩展Zend \ InputFilter \ InputFilter并将验证程序附加到扩展类中的过滤器来实现验证。我不确定这是否是最好的方法,因为我的验证与我的实体类完全分离。ZF2休息服务/原则验证

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

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

任何关于采取最佳方法的想法?由于这是一个REST实现,我不需要Zend \ Form提供的任何视觉效果。我应该继续扩展\ Zend \ InputFilter \ InputFilter吗?或者我应该进入注释方向?

回答

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()); 

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

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