make() 是 laravel 6 服务容器解析实例的核心方法,可自动反射构造依赖或配合 bind/singleton 自定义创建逻辑,并支持传参覆盖。

在 Laravel 6 中,make() 是服务容器最常用的解析方法,用于从容器中获取一个类或接口的实例对象。它不依赖是否提前绑定,只要类可自动构造(含依赖可被反射解析),就能直接创建并返回实例。
基础用法:直接传入类名或接口名
最简单的方式是把完整类名或接口名传给 app()->make():
$logger = app()->make(\Psr\Log\LoggerInterface::class);$cache = app()->make('cache'); // 使用字符串别名$service = app()->make(App\Services\OrderService::class);
如果该类未显式绑定,容器会通过 PHP 反射自动分析其构造函数参数,并递归解析所有依赖,最终 new 出实例。
配合绑定使用:控制实例化逻辑
若需自定义创建过程(比如传参、条件判断、复用单例等),应先用 bind() 或 singleton() 注册,再调用 make():
-
app()->bind('payment', function ($app) { return new StripePayment($app['config']['payment']); });
→ 每次make('payment')都新建一个实例 -
app()->singleton('db.connection', function ($app) { return new MySqlConnection(); });
→ 首次make()创建,后续全返回同一对象
注意:make() 不会自动执行绑定逻辑,必须先 bind 或 singleton 才能触发你写的闭包。
传参覆盖:动态注入构造参数
make() 支持第二个参数数组,用于覆盖反射解析出的依赖,适用于测试或临时替换:
$userRepo = app()->make(UserRepository::class, ['connection' => $mockConnection]);- 仅对本次解析生效,不影响后续调用
- 参数键名需与构造函数形参名一致(PHP 8+ 支持命名参数更直观)
常见误区提醒
别把 make() 当成“取已有对象”的缓存操作——它本质是“按需构建”。是否复用取决于是否注册为 singleton,或是否已存在 $instances 缓存项。没绑定也没缓存时,每次调用都是全新实例。
另外,instance() 注入的是已初始化对象,make() 调用它不会再次构造,而是直接返回那个实例;但这种情况较少见,多用于测试桩或第三方 SDK 封装。











