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(列表操作)。 但是,如果验证失败,该函数会自动重定向到 /album/add(表单所在的操作)。

是否可以不 redirect/refresh 而是以不同的方式处理错误消息? (例如,将它们作为数组转发到不同的操作)

isValid() 方法可以做各种事情。一点也不检查您在表单上设置的数据(使用 $form->setData($request->getPost()))是否正确。

首先,isValid()方法要求数据存在以进行检查。为了能够检查模型和输入过滤器是必需的。

InputFilter 可能包含一些通用的东西(例如 'required' => false/true 并且还可以包含每个输入的过滤器和验证器。

当您触发 isValid() 方法时,ZF2 会深入检查 $form 对象及其数据。为此,它将使用您为 $form 对象提供的 InputFilters。

首先,它会检查通用内容(必需的、允许为空的等)。接下来它 运行 遍历数据并将过滤器应用于数据。为此,它将名称(接收到的数据数组中的键)与表单输入的名称进行匹配。

应用过滤器后,它继续使用验证器验证数据,再次将数组键与输入名称匹配以找到要使用的名称。当验证(ValidatorChain 的)具有 运行 时,一个简单的 true/false 应用于 $valid 变量,最终 returned 到您的 isValid() "question" 在 if ($form->isValid()){..} 语句中。

回答你的第二个问题:是的,你可以做其他事情 after/before/during 你的表单验证。

例如,在 module.config.php 中,您可以注册 ViewJsonStrategy。这允许您将 return 数据作为 JSON,而不是渲染和 return 页面(导致刷新)。所以,除了 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 结合起来。您会发现 "model work" 要做的事少了很多。没有多少教程可以学习如何结合这 2 个,所以我将向您指出我自己的“ZF2 + Doctrine 2 blog tutorial”教程。我是为这两个初学者写的,但这里 'n' 那里可能过时了(2016 年中旬发布)。