php 松散耦合,使用 Laravel 的 监听者模式实现缓存机制的松散耦合

这篇博客分享了如何在Laravel中构建松散耦合的缓存机制,通过Event和Listener实现应用逻辑与缓存逻辑的解耦。在获取数据前触发事件,如果监听器返回缓存数据则直接使用,否则执行原始业务逻辑。通过这种方式,可以方便地切换不同的缓存驱动,并将缓存机制集成到插件中。

唔,我也不知道我接下来要讲的东西是不是配得上这个题目,总之就是分享一下我在搞 Blessing Skin Server 的缓存与插件机制时的一些经验(大佬们就请忽略吧)

既然要实现松散耦合的缓存机制,那就是要做到有没有缓存都没事。有缓存的话就走缓存,然后那边的模块内部实现一个包括过期时间呀啥啥的缓存机制,没有收到缓存模块的响应的时候就继续走原来的应用逻辑,一样可以正常响应。

因为我们是要实现应用逻辑与缓存逻辑的解耦,所以正常应用逻辑内是不能有对那些缓存的依赖的。那么我们要通过什么来和缓存模块通信呢?巧的是,Laravel 正好提供了基于 Event 和 Listener 的观察者模式,我们就可以用这种设计模式来解耦缓存模块。

首先,我们在即将获取一个可能需要缓存的数据之前,触发一个 GetDataEvent(举个栗子),接下来判断这个 Event 是否返回了响应,如有则使用响应的内容,没有的话就继续正常的应用逻辑来获取数据。

譬如说,我们需要把皮肤的预览图给缓存下来,而不是每次都去生成:

namespace App\Events;

use App\Events\Event;

use App\Models\Texture;

use Illuminate\Queue\SerializesModels;

class GetSkinPreview extends Event

{

use SerializesModels;

public $texture;

public $size;

/**

* 这里我们并没有做什么,就是把实例化时传进来的参数保存到对象里去

*

* @return void

*/

public function __construct(Texture $texture, $size)

{

$this->texture = $texture;

$this->size = $size;

}

}

// 控制器中的方法

public function preview($tid, $size = 250)

{

// 触发事件

$responses = Event::fire(new GetSkinPreview($t, $size));

// 当然,如果你有多个 Listener 的话,在这里你可能需要遍历 Event 所返回的响应

if (isset($responses[0]) && $responses[0] instanceof \Symfony\Component\HttpFoundation\Response) {

// 这个返回的响应类型是看你自己对 Event 的需求的

// 比如这里我们需要 Listener 返回一个 Http 响应流

return $responses[0];

} else {

/* 原来业务逻辑中的生成预览 */

return Response::png();

}

}

而这个 GetDataEvent,我们是可以注册 Listener 上去的,具体如何添加 Event 和 Listener 请参考 Laravel 文档。假设我们在这里给这个事件注册了一个 CacheDataListener,那么在 GetDataEvent 这个事件在应用逻辑中被触发的时候,Laravel 的 Event Dispatcher 就会把事件分发到我们刚刚注册的监听器里,我们就可以在监听器的 handle 方法中处理缓存逻辑并返回缓存后的数据了。

namespace App\Listeners;

use Storage;

use App\Events\GetSkinPreview;

class CacheSkinPreview

{

/**

* 处理缓存逻辑并返回一个 Http 响应流

*

* @param GetSkinPreview $event

* @return void

*/

public function handle(GetSkinPreview $event)

{

$tid = $event->texture->tid;

if (!Storage::disk('cache')->has("preview/$tid")) {

/* 这里生成预览并保存到缓存文件 */

}

return \Response::png(Storage::disk('cache')->get("preview/$tid"));

}

}

这样下来,我们就可以让应用逻辑和缓存逻辑(差不多)完全分离开来,想要使用其他的缓存驱动,例如 Redis 的话,只要新建一个 Listener 并监听 GetDataEvent 就可以了。你甚至可以把缓存机制放到插件里去,而这也就是我本来的目的(笑)

以上只是我的个人见解,如果有什么不对的地方,还请大佬们多指教啊 (つд⊂)

内容概要:本文档是一份关于“超声谐波成像中幅超声谐波成像中幅度调制聚焦超声引起的全场位移和应变的分析模型(Matlab代码实现)度调制聚焦超声引起的全场位移和应变的分析模型”的Matlab代码实现研究资料,重点构建了一个用于分析在超声谐波成像过程中,由幅度调制聚焦超声所引发的生物组织全场位移与应变的数学模型。该模型通过Matlab仿真手段实现了对声场激励下组织力学响应的精确计算与可视化,有助于深入理解超声激励与组织变形之间的物理机制,提升超声弹性成像的精度与可靠性。文档还附带多个相关科研领域的Matlab/Simulink代码实例,涵盖无人机控制、路径规划、电力系统仿真、信号处理、机器学习等多个方向,展示了强大的技术支撑与应用拓展能力。; 适合人群:具备Matlab编程基础,从事医学超声成像、生物力学建模、信号与图像处理等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于超声弹性成像中组织力学响应的仿真与分析;②为开发新型超声诊断技术提供理论模型与算法支持;③作为多物理场耦合仿真的教学与研究案例,促进跨学科技术融合。; 阅读建议:建议读者结合Matlab代码逐行理解模型实现细节,重点关注声场建模、组织力学方程求解及位移应变后处理部分。同时可参考文档中提供的其他仿真案例,拓宽研究思路,提升综合科研能力。
标题基于SpringBoot的高校餐饮档口管理系统设计与实现AI更换标题第1章引言介绍高校餐饮档口管理系统的研究背景、意义、国内外现状及论文方法与创新点。1.1研究背景与意义阐述高校餐饮档口管理现状及系统开发的重要性。1.2国内外研究现状分析国内外高校餐饮管理系统的研究与应用进展。1.3研究方法及创新点概述本文采用的研究方法及系统设计的创新之处。第2章相关理论总结与高校餐饮档口管理系统相关的现有理论。2.1SpringBoot框架理论阐述SpringBoot框架的原理、优势及其在Web开发中的应用。2.2数据库设计理论介绍数据库设计的基本原则、方法和步骤。2.3系统安全理论讨论系统安全设计的重要性及常见安全措施。第3章系统需求分析对高校餐饮档口管理系统的功能需求、性能需求等进行详细分析。3.1功能需求分析列举系统需实现的主要功能,如档口管理、订单处理等。3.2性能需求分析分析系统对响应时间、并发处理能力等性能指标的要求。3.3非功能需求分析阐述系统对易用性、可维护性等非功能方面的需求。第4章系统设计详细描述高校餐饮档口管理系统的设计过程。4.1系统架构设计给出系统的整体架构,包括前端、后端和数据库的设计。4.2模块设计详细介绍各个功能模块的设计,如用户管理、档口信息管理等。4.3数据库设计阐述数据库表结构的设计、数据关系及索引优化等。第5章系统实现与测试介绍高校餐饮档口管理系统的实现过程及测试方法。5.1系统实现系统各模块的具体实现过程,包括代码编写和调试。5.2系统测试方法介绍系统测试的方法、测试用例设计及测试环境搭建。5.3系统测试结果与分析从功能、性能等方面对系统测试结果进行详细分析。第6章结论与展望总结本文的研究成果,并展望未来的研究方向。6.1研究结论概括高校餐饮档口管理系统的设计与实现成果。6.2展望指出系统存在的不足及未来改进和扩展的方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值