使用观察员

时间:2017-07-17 20:05:50

标签: laravel observers laravel-echo

目前我正在使用观察者在创建和更新模型后处理一些事情。

我希望通过使用实时更新我的​​应用,但我无法找到有关将与观察者(而非事件)结合使用的文档。

您可以将事件及其广播功能与各自的侦听器结合使用以获得此功能,但我更喜欢更清晰的观察员代码(更少“神奇”)。

查看laravel框架的代码,我可以看到observable仍然使用雄辩的事件,所以我怀疑有一种方法来广播它们。

所以我的问题是:有没有办法使用广播有说服力的事件而无需创建单个事件或在每个事件上手动添加广播语句?

1 个答案:

答案 0 :(得分:4)

有趣的问题!我们可以创建一个可重用的通用观察器来广播从它观察到的模型中触发的事件。这消除了为每个场景创建单个事件的需要,我们可以继续使用现有的观察者:

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); 
...

如您所知,多个观察者可以观察到相同的模型。这是一个非常简单的例子。我们可以用这种模式做很多巧妙的事情。例如,我们可以声明我们想要在每个模型上广播哪些属性,并配置事件以过滤掉模型没有明确允许的任何属性。每个模型还可以声明事件发布到的通道或它应该广播的事件类型。

或者,我们可以从您现有的观察者广播该事件,但听起来您希望避免将这些语句添加到每个观察者。