2012-07-24 59 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()); 

所以我不認爲它很重要,你是否使用註釋來定義您的默認輸入的規則。無論您最初如何定義它們,您都將根據業務邏輯修改這些內容。

這聽起來像你可能會受益於將表單程序集移動到您的模型類中,以實現將驗證規則與實體完全分離的目標。我相信你的直覺是正確的,商業邏輯需要留在模型中,而不是在控制器或實體中。