Laminas (Zend Framework 3) Doctrine 输入过滤器回调验证器 - "Call to a member function getId() on null" when isValid false
Laminas (Zend Framework 3) Doctrine input filter callback validator - "Call to a member function getId() on null" when isValid false
我的应用程序中有一个图书管理模块。在编辑一本书的时候(在表格中)我想检查当前的阅读进度(阅读页数)是否不大于这本书的所有页数。表单字段称为 'currentprogress' 和 'totality'。
我正在使用回调验证器,它看起来像这样:
// Add inputfilter for 'currentprogress' field
$inputFilter->add([
'name' => 'currentprogress',
'required' => false,
'filters' => [
],
'validators' => [
[
'name' => 'Callback',
'options' => [
'messages' => [
\Laminas\Validator\Callback::INVALID_VALUE => 'Current progress cannot be greather than total size.',
],
'callback' => function($value, $context=[]) {
$currentprogress = $value;
$totality = $context['totality'];
$isValid = $currentprogress <= $totality;
return $isValid;
}
]
],
],
]);
我查了2个案例:
案例一:
当前进度 = 1
总数 = 150
我的应用成功更新了这本书
案例二:
当前进度 = 160
总数 = 150
我遇到异常
Call to a member function getId() on null
我知道 $currentprogress 和 $totality 的值相应地是 160 和 150(我使用 echo() 检查),所以 $isValid 应该是 false。
那么为什么上面的异常而不是 'currentprogress' 字段下验证器的消息?有什么想法吗?
我使用:
- php 7.4
- 层板
- 教义-orm-模块 ^4
提前感谢您的支持
我在控制器的 editAction 中找到了答案。
我在上面标记了代码中缺失的部分(注释 //START OF MISSING PART 和 //END OF MISSING PART)。
public function editAction()
{
...
if ($this->getRequest()->isPost()) {
...
if($form->isValid()) {
...
return $this->redirect()->toRoute('books',
['action' => 'index']);
}
//START OF MISSING PART
else{
...
return new ViewModel(array(
'publication' => $publication,
'form' => $form,
));
}
//END OF MISSING PART
} else {
...
return new ViewModel(array(
'publication' => $publication,
'form' => $form,
));
}
}
因此,当表单未通过 $isValid 测试时,它没有将所需的变量注入视图。导致异常。
我觉得有点愚蠢,但我认为在这里描述它有助于我找到解决方案。
感谢所有看过的人。
我的应用程序中有一个图书管理模块。在编辑一本书的时候(在表格中)我想检查当前的阅读进度(阅读页数)是否不大于这本书的所有页数。表单字段称为 'currentprogress' 和 'totality'。 我正在使用回调验证器,它看起来像这样:
// Add inputfilter for 'currentprogress' field
$inputFilter->add([
'name' => 'currentprogress',
'required' => false,
'filters' => [
],
'validators' => [
[
'name' => 'Callback',
'options' => [
'messages' => [
\Laminas\Validator\Callback::INVALID_VALUE => 'Current progress cannot be greather than total size.',
],
'callback' => function($value, $context=[]) {
$currentprogress = $value;
$totality = $context['totality'];
$isValid = $currentprogress <= $totality;
return $isValid;
}
]
],
],
]);
我查了2个案例:
案例一:
当前进度 = 1
总数 = 150
我的应用成功更新了这本书
案例二:
当前进度 = 160
总数 = 150
我遇到异常
Call to a member function getId() on null
我知道 $currentprogress 和 $totality 的值相应地是 160 和 150(我使用 echo() 检查),所以 $isValid 应该是 false。
那么为什么上面的异常而不是 'currentprogress' 字段下验证器的消息?有什么想法吗?
我使用:
- php 7.4
- 层板
- 教义-orm-模块 ^4
提前感谢您的支持
我在控制器的 editAction 中找到了答案。
我在上面标记了代码中缺失的部分(注释 //START OF MISSING PART 和 //END OF MISSING PART)。
public function editAction()
{
...
if ($this->getRequest()->isPost()) {
...
if($form->isValid()) {
...
return $this->redirect()->toRoute('books',
['action' => 'index']);
}
//START OF MISSING PART
else{
...
return new ViewModel(array(
'publication' => $publication,
'form' => $form,
));
}
//END OF MISSING PART
} else {
...
return new ViewModel(array(
'publication' => $publication,
'form' => $form,
));
}
}
因此,当表单未通过 $isValid 测试时,它没有将所需的变量注入视图。导致异常。
我觉得有点愚蠢,但我认为在这里描述它有助于我找到解决方案。
感谢所有看过的人。