首先,我将描述上下文。
我收到很多有关Offer
,for example: offerEditedBySeller, offerEditedByAdmin, offerTurnOff, etc
中的更改的通知。它们在控制器中的许多地方都被触发。
现在,我正在实现扩展的缓存,我想创建事件OfferChange
,在该事件中将重新加载特定商品的缓存。首先,我想在事件中触发这些通知,但我意识到要使其起作用,我将必须复制每个通知。
例如,假设我有事件(new OfferEdited())。它的侦听器将是 RefreshCacheForOffer,SendNotificationsAboutOfferEdit 等。对于像offerEdited
这样的每个通知,我都需要创建侦听器SendNotificationsAboutOfferEdit
,这只会触发特定的Notification。我想这不是我想要达到的目标。
有没有一种方法可以将事件/侦听器与通知绑定在一起?无论是offerEdited
,offerApproved
还是offerDisapproved
,它都将与事件OfferChange
绑定,这将触发侦听器RefreshCacheForOffer
和特定的作业下一个。这样,我就不必在每个控制器的操作中更改代码,也不必创建许多不必要的事件和侦听器。有可能吗?
编辑:
我知道我可以做到:
$user->notify(new offerEdited($offer));
event( new OfferChange($offer) );
但是我希望有一种更好的组织方式。
答案 0 :(得分:2)
为避免在控制器中更改大量代码,您可以在模型内部对其进行建模,并选择模型的“创建”或“更新”事件,然后调用后续事件。
class Offer extends Model
{
protected static function booted()
{
static::updated(function ($user) {
// check for condition and trigger event such as OfferEditedBySeller
});
}
}
如果您想使用事件/侦听器体系结构,那么我认为永远要通知一个事件和侦听器是您必须采取的方法。
或者,不要理会事件/侦听器-只需从控制器或模型的“创建”或“更新”事件发送通知即可。删除中间人(事件/侦听器),您将拥有更明确的代码,更易于遵循。
当您需要解耦和抽象时,事件/侦听器是很好的-但是,如果您正在做露骨的事情,那么不使用它们可能会更简单。