Laravel 6 官方容器不支持 makeWith 方法,应使用 make($abstract, $parameters) 传参;参数键名需匹配构造函数形参名,优先级高于上下文绑定和默认值;单例绑定下多次调用会忽略后续参数,需改用 bind 或 build() 实现动态实例化。

Laravel 6 并没有内置的 makeWith 方法。这是常见误解——框架原生容器(Illuminate\Container\Container)在 Laravel 6 中只提供 make($abstract, $parameters = []),而 makeWith 是社区封装或第三方扩展(如某些测试辅助包)的命名方式,并非官方 API。
正确用法:直接用 make() 传参
在 Laravel 6 中,要带参数解析类实例,统一使用 make() 的第二个参数数组:
- 参数键名需与构造函数中形参名一致(支持命名参数,但要求 PHP ≥ 8.0;Laravel 6 默认适配 PHP 7.2+,所以更推荐按位置顺序传)
- 若类构造函数为
public function __construct($id, $name),则调用app()->make(MyClass::class, [123, 'test']) - 若使用类型提示(如
__construct(User $user, string $role)),容器会自动解析类型提示的依赖,仅需为标量或非类型提示参数提供值,例如:app()->make(Authorizer::class, ['role' => 'admin'])
参数优先级与覆盖规则
当存在多种绑定配置时,Laravel 6 按以下顺序决定最终使用的参数:
- make() 调用时显式传入的参数(最高优先级)
- 上下文绑定(
when(...)->needs(...)->give(...)) - 类构造函数参数默认值(最低优先级)
这意味着你无需额外方法,make(MyClass::class, [...]) 本身就能精准控制每次解析的输入。
注意单例与参数冲突
如果目标类已注册为单例(singleton()),且你尝试用不同参数多次调用 make(),Laravel 6 会忽略后续参数,始终返回首次解析的缓存实例。原因在于单例判断逻辑中包含 !$needsContextualBuild(即:有参数或上下文绑定时跳过缓存)。因此:
- 需要每次用不同参数生成新实例 → 使用
bind()或不绑定,依赖默认解析 - 需要单例但又需动态参数 → 改用工厂闭包绑定,把参数逻辑封装进去,例如:
app()->bind(Service::class, function ($app) { return new Service(config('feature.flag')); });
替代方案:手动构建(build)
若需完全绕过容器绑定逻辑、仅做一次性的带参实例化,可用 build():
-
app()->build(MyClass::class)不查绑定、不走缓存,只做反射+依赖注入 - 但它不支持
$parameters参数数组,仅能处理类型提示依赖;标量参数仍需靠构造函数默认值或提前设置属性 - 一般用于测试或特殊场景,生产代码中推荐坚持用
make()+ 显式参数


















