Laravel 6 中接口绑定核心是注册“如何创建”的规则而非注入实例:用 bind() 或 singleton() 在服务提供者中绑定接口与实现类,再通过类型提示或 app() 自动解析,容器会递归注入依赖。

Laravel 6 中绑定接口并完成实例解析,核心是“先告诉容器接口该用谁实现,再让容器自动创建并注入”。不是把对象塞进去,而是把“怎么造”的规则注册进去。
接口绑定:用 bind() 或 singleton() 指定实现类
在服务提供者(如 AppServiceProvider 的 register() 方法中)写:
-
普通绑定(每次 new 一个):
$this->app->bind(RepositoryInterface::class, EloquentUserRepository::class); -
单例绑定(全局复用一个):
$this->app->singleton(CacheInterface::class, RedisCache::class);
注意:第二个参数必须是具体类名(字符串或 class 引用),不能是对象实例。Laravel 会通过反射自动构造,包括递归解析其构造函数依赖。
解析接口实例:直接类型提示或 app() 调用
绑定后无需手动 new,Laravel 在需要时自动处理:
-
控制器构造函数注入:
public function __construct(RepositoryInterface $repo) { ... }—— 请求进入时自动解析出EloquentUserRepository实例 -
闭包路由或手动解析:
$repo = app(RepositoryInterface::class);或resolve(RepositoryInterface::class)
只要接口已正确绑定,上述任一方式都会得到对应实现类的实例,且其自身依赖(比如 EloquentUserRepository 构造器里要的 Model)也会被容器自动注入。
验证是否生效:检查解析结果是否为预期类
可在 Tinker 或测试中快速确认:
-
get_class(app(RepositoryInterface::class))应返回"App\Repositories\EloquentUserRepository" - 若用
singleton(),两次app(X::class)应返回同一对象:app(CacheInterface::class) === app(CacheInterface::class)返回true
如果解析失败(报 Class not found 或 Target [X] is not instantiable),大概率是接口没绑定、实现类不存在、或构造函数参数无法被容器识别(比如缺少对应绑定或类型提示不明确)。


















