【问题标题】:Zend Framework 3 BaseInputFilter::setData() throws InvalidArgumentExceptionZend Framework 3 BaseInputFilter::setData() 抛出 InvalidArgumentException
【发布时间】:2018-02-26 12:13:56
【问题描述】:

我在 ZF3 中有一个动态的逐步设置表单。我使用字段集和默认表单来显示当前表单。默认表单仅添加了一个 csrf 令牌和一个提交按钮。表单实例化如下所示:

$form = new ReportForm();
foreach($requestedFieldsetNames as $fieldSetName) {
    $form->add([
        'type' => $this->registeredFieldSets[$fieldSetName],
        'options' => [
            'use_as_base_fieldset' => true,
        ]
    ]);
}
return $form;

表单显示正确,但是当我提交时,调用isValid()时抛出以下异常: Zend\InputFilter\BaseInputFilter::setData expects an array or Traversable argument; received string

我传递给表单的数据包含以下内容:

object(Zend\Stdlib\Parameters)[89]
  private 'storage' (ArrayObject) => 
    array (size=2)
      'entityType' => string 'drivers' (length=7)
      'csrf' => string '0c435d5f0ca21132ce85e26df65d2e5e-daf2a8843f01e607f23ce48a2c209262' (length=65)
      'submit' => string 'Next' (length=7)

entityType 是字段集的一部分。当我将 Traversable 对象传递给表单时,我不明白为什么会引发此异常。这发生在其他人身上吗?我该如何解决?提前致谢!

【问题讨论】:

  • 最好知道您的字段集中是否有 Collection?你也可以发布你的字段集吗?

标签: php zend-framework zend-form zend-framework3


【解决方案1】:

如果entityType 是一个字段集,你不能直接给它设置数据。您必须向其中的元素提供数据。因此,如果我们说您的字段集为;

final class entityType extends Fieldset {
    function init(){
         $this-add([
              'type' => 'Text', 
              'name' => 'my-field'
         ]);
    }
}

数据会是这样的;

'storage' => [
    'entityType' => [
        'my-field' => 'drivers
    ]
]

【讨论】:

  • 问题是我忘记在我的视图脚本中调用$form->prepare()。这解决了问题。
【解决方案2】:

这个问题真的很微不足道,真让我感到羞耻。我忘记在我的视图脚本中调用$form->prepare。调用$form->prepare()后,post数据设置正确,BaseInputFilter接受了数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多