【问题标题】:ZF2 form validation (isValid) behaviour / error messages handlingZF2 表单验证(isValid)行为/错误消息处理
【发布时间】:2017-08-10 12:24:29
【问题描述】:

我对函数 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(表单所在的操作)。

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

【问题讨论】:

    标签: php zend-framework2


    【解决方案1】:

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

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

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

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

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

    应用过滤器后,它继续使用验证器验证数据,再次将数组键与输入名称匹配以查找要使用的名称。当验证(ValidatorChain's)运行时,一个简单的true/false 应用于$valid 变量,最后在if ($form->isValid()){..} 语句中返回给你的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文件中,使上述sn-p工作:):

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

    以上就是答案。这是额外的:

    既然您正在学习,起首部分,请继续该教程。完成后,我建议您结合 Zend 提供的更高级的主题作为教程,例如在玩 Forms 时使用 Fieldsets。使用工厂也是学习的好东西。当你完成了这个(指望它需要一段时间,虽然我认为值得),看看结合 Zend Framework 和 Doctrine ORM。你会发现你要做的“模型工作”要少得多。没有多少教程可以学习如何将两者结合起来,所以我将向您指出我自己的“ZF2 + Doctrine 2 blog tutorial”教程。我为两者的初学者写了它,但这里的“n”可能已经过时了(2016 年中发布)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-04
      • 2017-05-12
      • 2013-02-10
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多