首页 > 解决方案 > Laravel - 我可以将事件绑定到通知吗?

问题描述

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

有没有办法将事件/侦听器与通知绑定?不管它是offerEditedofferApproved还是offerDisapproved与事件绑定OfferChange,这将触发监听器RefreshCacheForOffer和接下来的特定作业。这样我就不必更改每个控制器操作中的代码并创建许多不必要的事件和侦听器。可能吗?

编辑:
我知道我可以这样做:

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

但我希望有一种方法可以更好地组织它。

标签: laraveleventsnotifications

解决方案


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

class Offer extends Model
{

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

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

或者,不要打扰事件/侦听器 - 只需从控制器或模型的“创建”或“更新”事件发送通知。去掉中间人(事件/监听器),你将拥有更明确的代码,更容易理解。

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


推荐阅读