【问题标题】:Getting error when pasing an array as an argument to Event将数组作为参数传递给 Event 时出错
【发布时间】:2019-05-01 20:17:45
【问题描述】:

当我将数组作为参数传递给TeamMemberUpdating 事件时出现以下错误:

传递给 App\Events\Event ::__construct() 的参数 1 必须是 App\Models\Model 的实例,给定的 Illuminate\Database\Eloquent\Collection 的实例

这里是我触发事件的地方:

$teamMembers = TeamMember::whereIn('email', $request->projectTeamEmails)->get();
event(new TeamMemberUpdating($teamMembers));

我的活动:

class TeamMemberUpdating
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $teamMembers;
/**
 * Create a new event instance.
 *
 * @return void
 */
public function __construct(TeamMember $teamMembers)
{
    $this->teamMembers = $teamMembers;
}
}

还有我的听众handle() 方法:

public function handle(TeamMemberUpdating $event)

{   
    TeamMemberLog::insert($event->teamMembers);
}

【问题讨论】:

  • 取而代之的是public function __construct(TeamMember $teamMembers)public function __construct(Collection $teamMembers)

标签: php laravel event-listener


【解决方案1】:

您的事件类被定义为不处理数组,构造函数严格提示TeamMember 的单个实例

public function __construct(TeamMember $teamMembers)
{
    $this->teamMembers = $teamMembers;
}

你可以改成:

public function __construct($teamMembers)
{
    $this->teamMembers = $teamMembers;
}

这样,它将同时接受一个 TeamMember 和一个 Collection 的团队成员。您可以进行instanceof 检查以确定传入的内容。

或者,您可以更改调度方法:

$teamMembers = TeamMember::whereIn('email', $request->projectTeamEmails)->get();
$teamMembers->each(function ($teamMember) {
    event(new TeamMemberUpdating($teamMember));
});

这将为每个模型实例调度一个事件

【讨论】:

  • 为了避免混乱,侦听器处理程序应该接受集合,事件也,当事件被调用时,它应该类似于if (!($teamMembers instanceof Collection)) {collect($teamMembers)},它应该在控制器的一些私有方法中。允许相同的构造函数变量(如此处的 Event 类)接受不同的类型并不是一个好习惯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 2011-04-14
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多