Php Laravel观察员-有没有办法传递额外的参数?
因此,我使用Laravel模型事件观察器触发自定义事件逻辑,但它们只接受模型作为单个参数。我想做的是调用一个自定义事件,我还可以向它传递一些额外的参数,这些参数反过来会传递给Observer方法。大概是这样的:Php Laravel观察员-有没有办法传递额外的参数?,php,laravel,events,Php,Laravel,Events,因此,我使用Laravel模型事件观察器触发自定义事件逻辑,但它们只接受模型作为单个参数。我想做的是调用一个自定义事件,我还可以向它传递一些额外的参数,这些参数反过来会传递给Observer方法。大概是这样的: $this->fireModelEvent('applied', $user, $type); 然后在观察者中 /** * Listen to the applied event. * * @param Item $item
$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模型类中的一个或多个函数。我想在我调查的时候看看是否有人需要这么做
我通过使用trait实现一些自定义模型功能来完成这项任务
/**
* 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;
}
在我看来,当涉及其他上下文时,这种事情不属于您的模式。我通常不喜欢自定义模型事件的想法。我相信触发事件应该是一件明确的事情,而不是更改模型实例的副作用。如果将这两个关注点分开(更新模型和触发事件),则可以使用实际的事件类作为
$user
、$type
,以及其他任何对象的值对象。因此,我主要使用可观察对象,只是为了保持模型范围更清晰。这些确实是唯一的fire事件,它只是让我的自定义事件更干净,更容易遵循。我将更新上面的代码。直到最近,我实际上一直在模型中触发事件,因为我喜欢单独文件中的observables数组和事件触发逻辑。使跟踪它们变得更容易。在合并可观察事件触发时,不接受event::fire那样的参数列表似乎是一个疏忽,但我必须仔细研究一下。