Laravel中将类注入另一类时被注入类始终为null如何解决
Laravel类依赖注入属性为null解决方案
核心错误原因
你编写的OffersService类构造方法名称拼写错误,导致Laravel依赖注入机制无法识别构造方法参数,无法自动注入ImagesService实例。
PHP原生构造方法的标准名称是__construct(2个前缀下划线 + 单词construct),你代码中写的__constructor多了末尾的or字符,不属于PHP默认调用的构造方法,因此赋值逻辑不会自动执行,$imagesService属性始终为null。
修复步骤
- 修正
OffersService类的构造方法名称,修正后代码如下:
namespace App\Services; use App\Models\Action; use App\Models\Offer; use App\Models\OfferOption; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; class OffersService { protected $imagesService; // 修正构造方法名称 function __construct(ImagesService $imgService) { $this->imagesService = $imgService; } function doSomething() { $this->imagesService->saveImages(....); } }
- 确认
OffersService的实例化方式符合Laravel依赖注入规则:
依赖注入仅在通过Laravel服务容器解析类实例时生效,如果你手动通过
new OffersService()创建实例,需要自行传入ImagesService参数。两种标准的正确使用方式:
- 在控制器、命令、队列任务等Laravel原生支持注入的位置,直接将
OffersService作为方法参数传入,框架会自动解析嵌套依赖完成实例化- 手动获取实例时调用
app(OffersService::class),由服务容器完成注入逻辑
可选排查项
如果修正构造方法名称后仍存在注入问题,可按以下规则校验:
- 确认两个类的文件路径和命名空间完全匹配:
App\Services命名空间对应的文件必须放在项目根目录下的app/Services文件夹中,文件名和类名大小写完全一致(Linux环境下大小写敏感) - 如有自定义实例化逻辑,可在
app/Providers/AppServiceProvider.php的register方法中手动绑定类实现:
public function register() { $this->app->bind(OffersService::class, function ($app) { return new OffersService($app->make(ImagesService::class)); }); }
内容的提问来源于stack exchange,提问作者Adelin
相关产品推荐
相关产品推荐

