我对函数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(表单所在的操作)。
是否可以不重定向/刷新,而是以不同的方式处理错误消息? (例如,将它们作为数组转发给不同的动作)
答案 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年中期发布)。