【问题标题】:Laravel Observers - Any way to pass additional arguments?Laravel Observers - 有什么方法可以传递额外的参数?
【发布时间】:2017-05-16 02:53:30
【问题描述】:

所以我使用 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 模型类中的一个或多个函数。我想在我调查的时候看看是否有其他人需要这样做。

Also here's the docs reference

【问题讨论】:

  • IMO,当涉及其他上下文时,这种事情不属于您的模式。我通常不喜欢自定义模型事件的想法。我相信触发事件应该是明确的事情,而不是改变模型实例的副作用。如果你将这两个问题分开(更新模型和触发事件),你可以使用一个实际的 Event 类作为你的 $user$type 和其他任何东西的值对象。
  • 所以我主要使用 Observables 只是为了让我的模型范围更干净。这些真的只会触发事件,它只是让我的自定义事件更清晰,更容易遵循。我将在上面更新我的代码。
  • 直到最近我实际上一直在模型中触发事件,因为我喜欢 observables 数组和单独文件中的事件触发逻辑。使跟踪它们变得更容易。似乎对可观察事件触发的合并疏忽不接受像 Event::fire 这样的参数列表,但我必须四处挖掘。

标签: php laravel events


【解决方案1】:

我已经通过使用 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;
}

【讨论】:

    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    相关资源
    最近更新 更多