Я получаю следующую ошибку, когда передаю массив в качестве аргумента событию TeamMemberUpdating:
Argument 1 passed to App\Events\Event ::__construct() must be an instance of App\Models\Model, instance of Illuminate\Database\Eloquent\Collection given
Вот где я запускаю событие:
$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);
}






Ваш класс событий определен так, чтобы не обрабатывать массивы, конструктор строго намекает на один экземпляр 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 здесь) принимать другой тип.
Вместо
public function __construct(TeamMember $teamMembers)поставьтеpublic function __construct(Collection $teamMembers)