php - Laravel:事件监听器 - 传递给 {closure}() 的参数 1 必须是数组类型,对象给定
问题描述
我希望这个问题不要重复。
我定义了以下事件:
Event::listen('test', function(array $data){
dd($data);
});
当我尝试触发它时,我收到以下异常:
event('test', [
'foo' => 'bar',
'asdf' => 'ghjk',
]);
类型错误:
传递给 {closure}() 的参数 1 必须是数组类型,给定对象
但是,如果我按以下方式执行它,则不会出现问题:
event('test', [[
'foo' => 'bar',
'asdf' => 'ghjk',
]]);
问题:如果我想将一个严格的数组传递给侦听器闭包,有没有办法避免将我的 var 包装在另一个数组中?
解决方案
在深入研究框架后,我想我找到了“问题”。
您传递给侦听器的数组应该是回调的参数。IE)
Event::listen('test', function($foo, $bar, $baz) {
dd($foo, $bar, $baz);
});
event('test', ['foo', 'bar', 'baz']);
当您将数组传递给 event() 助手时,它最终会调用 Illuminate\Events\Dispatcher 中的 makeListener 来执行您的闭包。在该方法中,它按如下方式调用您的侦听器:
return $listener(...array_values($payload));
那么原因如下:
event('test', [[
'foo' => 'bar',
'asdf' => 'ghjk',
]]);
有效,是因为:
...array_values([[
'foo' => 'bar',
'asdf' => 'ghjk',
]])
只是 ['foo' => 'bar', 'asdf' => 'ghjk']
希望有帮助!其中一件事就是找到正确的文档!
所以要回答你的终极问题:
“问题:如果我想将一个严格的数组传递给侦听器闭包,有没有办法避免将我的 var 包装在另一个数组中?”
不 :(
推荐阅读
- mysql - MySQL group by + order by 慢得令人费解
- listview - 您可以将参数传递给 Xamarin.Forms 应用程序中的 DataTemplateSelector 构造函数吗?
- haskell - Haskell:通过“fromIntegral”了解类型转换机制
- prolog - 为什么 prolog 不会在 cut 时停止?
- python - Python imaplib 使用 \\Deleted 标志恢复电子邮件并移至垃圾箱
- ios - How do I improve the accuracy of number of weekdays in a month calculation?
- python - 如果事务由两行或更多行表示,是否有办法使用 python 对事务(日志)数据进行聚类?
- python - 如何获得分数以更新并显示在屏幕上?
- regex - pandas df中数字的条件替换
- reporting-services - SSRS - 如何计算由表达式生成的列中的值?