Laravel依赖注入失效:AppServiceProvider注册后实例化类报错
问题分析与解决
你遇到的问题核心是:手动用new关键字实例化类时,Laravel的服务容器不会介入依赖注入。
你在服务提供者里注册的SocialChannelContract绑定,只有当通过Laravel容器来创建类A的实例时,容器才会自动帮你注入对应的MyChannel实例。而你直接写new A($callBackQueryDVO)是PHP原生的实例化方式,容器完全不会参与其中,所以PHP会严格按照类A的构造函数要求,提示你缺少第一个参数。
给你三种可行的解决办法:
通过容器的
make方法创建实例
这是最符合Laravel依赖注入设计的方式,容器会自动注入SocialChannelContract的实现,同时你可以传递动态的CallBackQueryDVO参数:return app()->make(A::class, ['message' => $callBackQueryDVO]);也可以用更简洁的辅助函数:
return make(A::class, ['message' => $callBackQueryDVO]);在容器管理的类中通过方法注入
如果你的代码本身就在Laravel容器管理的类里(比如控制器、自定义服务类),可以直接通过方法参数注入类A的实例,不过这种方式适合不需要动态传递CallBackQueryDVO的场景:public function handle(A $a) { // 这里的$a已经是容器注入好依赖的实例 }手动获取依赖后再new
如果你坚持要用new关键字,那需要自己从容器中取出SocialChannelContract的实例,再传入构造函数:$channel = app()->make(SocialChannelContract::class); return new A($channel, $callBackQueryDVO);
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

