Laravel-我可以将事件绑定到通知吗?

时间:2020-10-29 12:37:00

标签: laravel events notifications

首先,我将描述上下文。
我收到很多有关Offerfor example: offerEditedBySeller, offerEditedByAdmin, offerTurnOff, etc中的更改的通知。它们在控制器中的许多地方都被触发。
现在,我正在实现扩展的缓存,我想创建事件OfferChange,在该事件中将重新加载特定商品的缓存。首先,我想在事件中触发这些通知,但我意识到要使其起作用,我将必须复制每个通知。
例如,假设我有事件(new OfferEdited())。它的侦听器将是 RefreshCacheForOffer,SendNotificationsAboutOfferEdit 等。对于像offerEdited这样的每个通知,我都需要创建侦听器SendNotificationsAboutOfferEdit,这只会触发特定的Notification。我想这不是我想要达到的目标。

有没有一种方法可以将事件/侦听器与通知绑定在一起?无论是offerEditedofferApproved还是offerDisapproved,它都将与事件OfferChange绑定,这将触发侦听器RefreshCacheForOffer和特定的作业下一个。这样,我就不必在每个控制器的操作中更改代码,也不必创建许多不必要的事件和侦听器。有可能吗?

编辑:
我知道我可以做到:

$user->notify(new offerEdited($offer));
event( new OfferChange($offer) );

但是我希望有一种更好的组织方式。

1 个答案:

答案 0 :(得分:2)

为避免在控制器中更改大量代码,您可以在模型内部对其进行建模,并选择模型的“创建”或“更新”事件,然后调用后续事件。

class Offer extends Model
{

    protected static function booted()
    {
        static::updated(function ($user) {
            // check for condition and trigger event such as OfferEditedBySeller
        });
    }
}

如果您想使用事件/侦听器体系结构,那么我认为永远要通知一个事件和侦听器是您必须采取的方法。

或者,不要理会事件/侦听器-只需从控制器或模型的“创建”或“更新”事件发送通知即可。删除中间人(事件/侦听器),您将拥有更明确的代码,更易于遵循。

当您需要解耦和抽象时,事件/侦听器是很好的-但是,如果您正在做露骨的事情,那么不使用它们可能会更简单。