处理

时间:2017-08-10 12:24:30

标签: php zend-framework2

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

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

1 个答案:

答案 0 :(得分:3)

isValid()方法可以执行各种操作。至少检查您在表单上设置的数据($form->setData($request->getPost()))是否正确。

首先,isValid()方法要求检查数据。能够检查Model和InputFilter是必需的。

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

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

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

应用过滤器之后,它继续使用验证器验证数据,再次将数组键与输入名称匹配以查找要使用的数据。验证(ValidatorChain' s)运行后,一个简单的true/false适用于$valid变量,该变量最终会返回到您的isValid()"问题&# 34;在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结合起来。你会发现你的模特工作少了很多,而且#34;去做。目前还没有很多教程可以学习如何将2组合在一起,所以我将指向你自己的#34; ZF2 + Doctrine 2 blog tutorial"教程。我是为两个初学者写的,但是这里' n'在那里可能会过时(2016年中期发布)。