12

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

使其实时更新我的​​应用程序,但我无法找到有关与观察者(而不是事件)结合使用的文档。

您可以将事件及其广播功能与它们各自的侦听器结合使用来获得此功能,但我更喜欢观察者的更简洁的代码(不那么“魔法”)。

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

所以我的问题是:有没有一种方法可以使用广播雄辩的事件,而无需创建单个事件或在每个事件上手动添加广播语句?

4

1 回答 1

5

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

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

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

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

于 2017-09-28T05:46:56.613 回答