【问题标题】:Broadcasting eloquent events using observers使用观察者广播雄辩的事件
【发布时间】:2017-12-22 11:53:31
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我现在处于同样的位置。我试图在观察者中实现 ShouldBroadcast 但没有运气。你有没有找到任何魔法更少的解决方案?
  • 我会说你不能。但是您可以编写一个动态事件,它将处理您所有的观察者。如果您给我们一个更具体的例子来说明您想要实现的目标,我们可以找到解决方案。例如,您可以编写事件,这将从被调用的观察者那里获取所有更改并将其传递给广播频道。
  • 快速查看代码后,看起来对于模型事件,模型被视为被调度的事件,因此尝试将ShouldBroadcast接口添加到您的模型中,并定义@ 987654325@方法实现接口。这是未经测试的,因此请告诉我们这是否符合您的要求。
  • @mimo 我当前的项目有一些观察者处理雄辩的事件(创建、保存等)我需要用它们的当前状态广播模型。
  • 您是否要广播所有模型事件?或者只是某些模型上的某些事件?

标签: laravel-echo laravel-echo laravel-echo laravel observers laravel-echo


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多