[英]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.