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 年中旬发布)。
我对函数 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 年中旬发布)。