Поэтому я использую наблюдатели событий модели Laravel для запуска пользовательской логики событий, но они принимают модель только как один аргумент. То, что я хотел бы сделать, это вызвать пользовательское событие, которое я также могу передать некоторым дополнительным аргументам, которые, в свою очередь, будут переданы методу Observer. Что-то вроде этого:
$this->fireModelEvent('applied', $user, $type);
А потом в Обозревателе
/**
* Listen to the applied event.
*
* @param Item $item
* @param User $user
* @param string $type
* @return void
*/
public function applied(Item $item, $user, string $type) {
Event::fire(new Applied($video, $user, $type));
}
Как вы можете видеть, я заинтересован в том, чтобы передать пользователю, который выполнил это действие, но не тот, который обязательно создал элемент. Я не думаю, что временные атрибуты модели являются ответом, потому что моя дополнительная логика событий ставится в очередь как задания, чтобы поддерживать как можно меньшее время отклика. У кого-нибудь есть идеи о том, как я могу расширить Laravel, чтобы позволить мне это сделать?
Моя теория заключается в том, чтобы создать пользовательскую черту, которая переопределяет одну или несколько функций в базовом классе модели Laravel, который обрабатывает эту логику. Думаю, я посмотрю, нужно ли кому-то еще делать это, пока я в этом разбираюсь.
Я выполнил эту задачу, реализовав некоторые пользовательские функциональные возможности модели, используя черту.
/**
* Stores event key data
*
* @var array
*/
public $eventData = [];/**
* Fire the given event for the model.
*
* @param string $event
* @param bool $halt
* @param array $data
* @return mixed
*/
protected function fireModelEvent($event, $halt = true, array $data = []) {
$this->eventData[$event] = $data;
return parent::fireModelEvent($event, $halt);
}/**
* Get the event data by event
*
* @param string $event
* @return array|NULL
*/
public function getEventData(string $event) {
if (array_key_exists($event, $this->eventData)) {
return $this->eventData[$event];
}
return NULL;
}
Других решений пока нет …