Получение ошибки при передаче массива в качестве аргумента для события

Я получаю следующую ошибку, когда передаю массив в качестве аргумента событию 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);
}

Вместо public function __construct(TeamMember $teamMembers) поставьте public function __construct(Collection $teamMembers)

Tpojka 01.05.2019 14:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
155
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 здесь) принимать другой тип.

Tpojka 01.05.2019 14:33

Другие вопросы по теме