首页 > 解决方案 > 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 包装在另一个数组中?

标签: phplaravel

解决方案


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

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

不 :(


推荐阅读