有趣的问题!我们可以创建一个可重用的通用观察者,它广播从它观察到的模型中触发的事件。这消除了为每个场景创建单独事件的需要,我们可以继续使用现有的观察者:
class BroadcastingModelObserver
{
public function created(Model $model)
{
event(new BroadcastingModelEvent($model, 'created'));
}
public function updated(Model $model) { ... }
public function saved(Model $model) { ... }
public function deleted(Model $model) { ... }
}
class BroadcastingModelEvent implements ShouldBroadcast
{
public $model;
public $eventType;
public function __construct(Model $model, $eventType)
{
$this->model = $model;
$this->eventType = $eventType;
}
public function broadcastOn() { ... }
}
然后,只需指示观察者观察您需要将事件广播到 Echo 的任何模型:
User::observe(BroadcastingModelObserver::class);
Post::observe(BroadcastingModelObserver::class);
...
如您所知,多个观察者可以观察同一个模型。这是一个非常简单的例子。我们可以用这种模式做很多整洁的事情。例如,我们可以声明我们希望在每个模型上广播哪些属性,并配置事件以过滤掉模型未明确允许的任何属性。每个模型还可以声明事件发布到的通道或它应该广播的事件类型。
或者,我们可以从您现有的观察者那里广播该事件,但听起来您希望避免将这些陈述添加到每个陈述中。