为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel:事件监听器 - 传递给 {closure}() 的参数 1 必须是数组类型,给定对象

Laravel:事件监听器 - 传递给 {closure}() 的参数 1 必须是数组类型,给定对象

PHP
慕的地10843 2023-07-08 17:40:41
我希望这个问题不会重复。我定义了以下事件:Event::listen('test', function(array $data){    dd($data);});当我尝试触发它时,我收到以下异常:event('test', [    'foo' => 'bar',    'asdf' => 'ghjk',]);错误类型:传递给 {closure}() 的参数 1 必须是数组类型,给定对象但是,如果我按照以下方式执行,则不会出现问题:event('test', [[    'foo' => 'bar',    'asdf' => 'ghjk',]]);问题:如果我想将严格数组传递给侦听器闭包,有没有办法避免将我的 var 包装在另一个数组中?
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

在深入研究了框架之后,我想我已经找到了“问题”。


您传递给侦听器的数组应该是回调的参数。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 包装在另一个数组中?”


查看完整回答
反对 回复 2023-07-08
  • 1 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信