Laravel监听器__construct与handle方法的区别及触发规则
现象产生原因
你遇到的只执行监听器__construct()不执行handle()的问题,是因为你在监听器构造方法中写了dd("construct")终止执行逻辑,程序在监听器实例化阶段就直接退出,根本不会走到后续调用handle()的流程。
Laravel 事件系统调度监听器的固定执行顺序如下:
- 调用
event()分发事件时,框架首先读取事件服务提供者中$listen配置,找到当前事件绑定的所有监听器类 - 框架通过服务容器逐个实例化监听器类,实例化过程会自动执行类的
__construct()构造方法 - 监听器实例化完成后,框架才会依次调用每个监听器实例的
handle()方法,将当前事件对象作为参数传入,执行业务逻辑
__construct() 与 handle() 的执行逻辑区别
__construct():是PHP类原生的构造方法,执行时机为监听器类被服务容器实例化的瞬间,早于事件业务逻辑执行。这个方法的设计用途是注入监听器运行所需的外部依赖(比如相关的服务类、仓库实例、配置项等),不应该在这里编写事件处理相关的业务代码。只要框架需要加载这个监听器,构造方法就会执行,和后续是否真的处理事件无关。handle():是Laravel事件系统约定的监听器业务入口方法,只有在监听器实例化完成、事件未被前置逻辑终止传播时才会执行。这个方法的设计用途是编写事件触发后的实际处理逻辑,方法参数为当前触发的事件实例,你可以从中获取事件携带的所有业务数据。
你可以尝试把监听器构造方法中的dd("construct")移除,或者改为不终止程序的日志输出,就能看到程序正常进入handle()方法执行。
内容的提问来源于stack exchange,提问作者Ubaid Ur Rehman
相关产品推荐
相关产品推荐

