Laravel Observers - 任何传递额外参数的方法?

时间:2017-05-11 19:20:55

标签: php laravel events

所以我使用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让我这样做的想法?

我的理论是做一个自定义特征,它覆盖处理这个逻辑的基本层次模型类中的一个或多个函数。我以为在看的时候我会看到是否有其他人需要这样做。

Also here's the docs reference

1 个答案:

答案 0 :(得分:1)

我通过使用特征实现一些自定义模型功能来完成此任务。

/**
 * 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;
}