网站可以随便创建么网页广告屏蔽

张小明 2025/12/24 4:37:50
网站可以随便创建么,网页广告屏蔽,wordpress 洛神的主题,制作网站公司多少钱在 Laravel 的事件监听器#xff08;Listener#xff09;中#xff0c;通过类型提示事件对象#xff08;如 OrderShipped $event#xff09; 是实现解耦与多态的关键机制。它使监听器只关心事件数据本身#xff0c;而不关心事件如何被触发或由谁触发#xff0c;从而实现…在 Laravel 的事件监听器Listener中通过类型提示事件对象如OrderShipped $event 是实现解耦与多态的关键机制。它使监听器只关心事件数据本身而不关心事件如何被触发或由谁触发从而实现发布-订阅模式Publish-Subscribe 的松耦合架构。一、核心机制事件分发与类型匹配Laravel 的事件系统通过服务容器Service Container 和反射Reflection 实现监听器的自动调用1.触发事件// 在控制器、Service 或模型中event(newOrderShipped($order,$customer));2.监听器定义// app/Listeners/SendShipmentNotification.phpclassSendShipmentNotification{publicfunctionhandle(OrderShipped$event)// ← 类型提示事件类{// 处理发货通知Mail::to($event-customer-email)-send(newShipmentMail($event-order));}}3.事件注册// app/Providers/EventServiceProvider.phpprotected$listen[OrderShipped::class[SendShipmentNotification::class,UpdateInventory::class,// ... 其他监听器],];二、如何实现解耦✅ 1.监听器只依赖事件数据不依赖触发源无论事件是在控制器、队列 Job还是Eloquent 模型观察者中触发监听器的代码完全不变。监听器不知道也不关心事件来源只消费OrderShipped对象。✅ 2.事件类作为数据载体DTO// app/Events/OrderShipped.phpclassOrderShipped{useSerializesModels;publicfunction__construct(publicOrder$order,publicCustomer$customer){}}事件类是纯数据对象类似 DTO无业务逻辑。监听器通过$event-order、$event-customer获取所需数据。✅ 3.多监听器响应同一事件多个监听器可响应同一事件彼此完全独立// 发货事件触发// 1. SendShipmentNotification → 发邮件// 2. UpdateInventory → 更新库存// 3. LogShipment → 记录日志新增监听器无需修改触发源符合开闭原则。✅ 4.事件可被队列化监听器自动反序列化classSendShipmentNotificationimplementsShouldQueue{publicfunctionhandle(OrderShipped$event)// ← 队列中自动还原事件对象{// ...}}Laravel 自动序列化/反序列化事件对象监听器无需关心队列细节。三、对比不使用类型提示的紧耦合方式❌ 反例监听器依赖具体触发逻辑// 错误设计监听器需要知道订单 ID 和客户 IDpublicfunctionhandle($orderId,$customerId)// ← 参数散乱语义不 clear{$orderOrder::find($orderId);// ← 隐式依赖 Eloquent$customerCustomer::find($customerId);// ...}问题参数不明确调用者需知道传递哪些数据隐式依赖监听器直接调用Order::find()无法 Mock难以扩展新增数据需修改所有监听器签名四、高级技巧事件继承与多态监听1.定义事件基类abstractclassOrderEvent{publicfunction__construct(publicOrder$order){}}classOrderShippedextendsOrderEvent{}classOrderCancelledextendsOrderEvent{}2.监听器响应多种事件classLogOrderActivity{// 通过类型提示基类响应所有 OrderEventpublicfunctionhandle(OrderEvent$event){Log::info(Order{$event-order-id}activity,[eventget_class($event)]);}}✅多态分发同一监听器处理多种事件类型。五、为什么类型提示能提升可测试性// 测试监听器publicfunctiontest_shipment_notification_is_sent(){$ordernewOrder([id123]);$customernewCustomer([emailtestexample.com]);// 创建事件对象无需触发真实事件$eventnewOrderShipped($order,$customer);// 直接调用监听器$listenernewSendShipmentNotification();$listener-handle($event);// 断言邮件已发送Mail::assertSent(ShipmentMail::class,function($mail)use($order){return$mail-order-id$order-id;});}无需模拟事件分发系统事件对象可轻松构造监听器逻辑独立测试六、Laravel 内部机制如何匹配监听器当event(new OrderShipped(...))被调用时查找监听器从EventServiceProvider的$listen数组中找到OrderShipped::class对应的监听器列表。实例化监听器通过服务容器解析监听器支持依赖注入。调用handle()方法使用反射检查handle()方法的参数类型如果参数类型是OrderShipped则传入当前事件实例。支持其他依赖注入如LoggerInterface $logger。整个过程由Dispatcher类自动化开发者只需定义事件和监听器。七、总结类型提示事件对象的解耦价值优势说明发布-订阅解耦触发者与监听者无直接依赖数据封装事件类作为结构化数据载体多监听器支持一个事件触发多个独立操作可测试性监听器可独立单元测试可扩展性新增监听器无需修改触发源队列友好事件自动序列化监听器无感知事件系统是 Laravel 实现“关注点分离”的利器核心业务逻辑如“订单发货”只负责触发事件副作用逻辑如发邮件、更新库存由监听器处理通过类型提示事件对象Laravel 将这一模式简化为“定义类 类型提示”既保持了代码的简洁性又实现了企业级的松耦合架构——正如所重视的“通过合理抽象实现可演进的系统”。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

海淀网站建设价格中国工程建设标准化协会网站

DeepSeek-V3模型量化部署终极指南:从工业级到消费级的跨越 【免费下载链接】DeepSeek-V3 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-V3 痛点共鸣:大模型部署的现实困境 当你面对700GB的模型权重下载,8张H100显卡的…

张小明 2025/12/20 17:01:01 网站建设

个人 可以做网站备案吗wordpress二手车模板

智能学习助手chaoxing_tool:重构网课学习体验的技术解析 【免费下载链接】chaoxing_tool 超星网课助手,拥有 一键完成超星中的任务点/刷取课程学习次数/下载课程资源 等功能。基于python语言 项目地址: https://gitcode.com/gh_mirrors/ch/chaoxing_to…

张小明 2025/12/20 16:59:00 网站建设

个人网站模板 免费个人 网站备案 幕布

聚餐结束后的账单拆分,常是欢乐夜晚中令人头疼的“小插曲”:谁点了更贵的菜?酒水怎么算?税和小费如何分摊?这些琐碎的细节常常让友谊面临“数学考验”。而现在,有了 Easy Bill Splitter 这款智能账单拆分工…

张小明 2025/12/20 16:56:58 网站建设

网站建设课程感想视频网站开发应用到哪些技术

抖动时间是指操作系统中进程或线程执行时间的不稳定性。当任务无法按照预定的时间间隔执行,或者执行时间出现较大波动时,就会发生抖动现象。这种现象可能导致系统性能下降、延迟增加以及不稳定性等问题。抖动的主要原因包括资源竞争、中断处理、调度算法…

张小明 2025/12/20 16:54:57 网站建设

大兴网站建设一条龙u钙网logo设计文字头像

AWS Lambda 函数开发全攻略 1. 测试 Lambda 函数 在开发 Lambda 函数时,测试是必不可少的环节。在示例事件部分,我们可以传入以下事件,然后选择“保存并测试”选项: {"key": "My Printed Value!!" }代码执行完成后,你应该会得到类似如下的执行结果…

张小明 2025/12/20 16:52:55 网站建设

单位服务器网站打不开中山哪家建网站好

Vue-Office终极指南:3分钟实现Web端Office文件预览 【免费下载链接】vue-office 项目地址: https://gitcode.com/gh_mirrors/vu/vue-office 想要在Vue项目中快速集成Word、Excel和PDF文件预览功能吗?Vue-Office组件库为您提供一站式解决方案&…

张小明 2025/12/20 16:50:54 网站建设