簡體   English   中英

ZF2表單驗證(isValid)行為/錯誤消息處理

[英]ZF2 form validation (isValid) behaviour / error messages handling

我對isValid函數的實際作用感到困惑,有人可以幫助我理解嗎?

這是ZF相冊教程中的函數:

     public function addAction()
 {
     $form = new AlbumForm();
     $form->get('submit')->setValue('Add');

     $request = $this->getRequest();
     if ($request->isPost()) {
         $album = new Album();
         $form->setInputFilter($album->getInputFilter());
         $form->setData($request->getPost());

         if ($form->isValid()) {
             $album->exchangeArray($form->getData());
             $this->getAlbumTable()->saveAlbum($album);

             // Redirect to list of albums
             return $this->redirect()->toRoute('album');
         }  
     } 
     return array('form' => $form);
 }

我的問題是:

驗證表單后,將有一個明確的重定向到路由/相冊(列表操作)。 但是,如果驗證失敗,該函數將自動重定向到/ album / add(表單所在的操作)。

是否可以不重定向/刷新,而是以其他方式處理錯誤消息? (例如,將它們作為數組轉發到其他操作)

isValid()方法可以完成所有事情。 至少要檢查您在表單上設置的數據(使用$form->setData($request->getPost()) )是否正確。

首先, isValid()方法要求存在要檢查的數據。 為了能夠檢查模型和InputFilter是必需的。

InputFilter可能包含一些通用的東西(例如'required' => false/true ,並且每個輸入還可以包含過濾器和驗證器。

觸發isValid()方法時,ZF2會深入檢查$form對象及其數據。 為此,它將使用為$form對象提供的InputFilters。

首先,它檢查通用的東西(必填,允許為空等)。 接下來,它將遍歷數據並將過濾器應用於數據。 為此,它將名稱(接收到的數據數組中的鍵)與表單輸入的名稱進行匹配。

應用過濾器后,它繼續使用驗證器驗證數據,再次將陣列鍵與輸入名稱匹配,以查找要使用的數據。 驗證(ValidatorChain's)運行后,簡單的true/false應用於$valid變量,該變量最后在if ($form->isValid()){..}返回給isValid() “問題” if ($form->isValid()){..}聲明。

要回答第二個問題:是的,您可以在表單驗證之后/之前/期間進行其他操作。

例如,在module.config.php您可以注冊ViewJsonStrategy 這樣,您無需渲染並返回頁面(導致刷新),就可以將數據作為JSON返回。 因此,您可以執行以下操作,而不是return $this->redirect()->toRoute('album')

if ($this->getRequest()->isXmlHttpRequest()) {
    return new JsonModel([
        'form' => $form,
        'messages' => $form->getMessages(),
    ]);
}

// Redirect to list of albums (triggered if above if() is not true)
return $this->redirect()->toRoute('album');

額外:注冊ViewJsonStrategy ,將其添加到模塊(或通用模塊)的module.config.php文件中,使以上代碼片段起作用:):

'view_manager' => [
    /* ... */
    'strategies' => [
        'ViewJsonStrategy',
    ],
],

以上是答案。 這是額外的:

由於您正在學習中,起首部分,請繼續該教程。 完成后,建議您結合Zend提供的更高級的主題作為教程,例如在玩Forms時使用Fieldsets。 同時使用工廠是一件好事。 當您完成該工作時(花點時間,雖然我認為值得),然后看看將Zend Framework與Doctrine ORM結合起來。 您會發現要做的“模型工作”要少得多。 那里沒有太多的教程來學習如何結合這兩個教程,因此,我將向您介紹我自己的“ ZF2 + Doctrine 2博客教程 ”教程。 我為兩者的初學者編寫了它,但是這里可能要過時了(發布於2016年中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM