Laravel事件监听器handle方法类型提示附加类传参报错问题
报错原因
Laravel事件系统的调度逻辑里,调用监听器的handle方法时,仅会传入当前触发的事件实例作为唯一参数,不会自动解析handle方法签名中声明的其他依赖,因此你在handle里声明第二个LeadService参数时,框架不会自动传值,直接触发参数数量不足的报错。
注意:Laravel的控制器方法支持依赖和请求参数混合注入,但事件监听器、队列任务这类场景的处理方法不支持该逻辑,依赖注入需要走构造函数。
正确实现方式
将需要引入的依赖类移到监听器的构造函数中声明,由服务容器在实例化监听器时自动解析注入,handle方法仅保留事件对象一个参数即可:
use App\Events\LeadCreated; use App\Services\LeadService; class NewLeadNotifyProspectListener { /** * 通过构造函数注入依赖 */ public function __construct( protected LeadService $leadService ) {} /** * 处理事件 * * @param \App\Events\LeadCreated $event * @return void */ public function handle(LeadCreated $event) { $this->leadService->notifyProspect($event->lead); } }
另外你贴的事件类代码存在缺失引入的问题,实际运行会触发类找不到报错,记得补上对应类的引用:
use App\Models\Lead; use Illuminate\Http\Request; use Illuminate\Broadcasting\PrivateChannel; class LeadCreated { public function __construct( public Lead $lead, public Request $request ) {} public function broadcastOn() { return new PrivateChannel('channel-name'); } }
内容的提问来源于stack exchange,提问作者farjam
相关产品推荐
相关产品推荐

