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 的值相应地是 160150(我使用 echo() 检查),所以 $isValid 应该是 false

那么为什么上面的异常而不是 'currentprogress' 字段下验证器的消息?有什么想法吗?

我使用:

提前感谢您的支持

我在控制器的 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 测试时,它没有将所需的变量注入视图。导致异常。

我觉得有点愚蠢,但我认为在这里描述它有助于我找到解决方案。

感谢所有看过的人。