Laravel 6 中获取服务主要通过自动依赖注入和手动解析两种方式:构造函数注入最常用,app() 或 $this->app->make() 用于临时场景,绑定服务需在服务提供者中注册。

在 Laravel 6 中,服务容器实例默认已绑定到应用全局,控制器中无需手动创建容器对象,主要通过两种方式获取服务:自动依赖注入(推荐)和手动解析(app() 或 $this->app)。
构造函数自动注入服务
这是最常用、最符合 Laravel 设计理念的方式。容器会根据类型提示自动解析并传入实例:
- 确保服务类已正确命名空间,并能被自动加载(如放在
app/Services下) - 在控制器构造函数中声明类型提示,Laravel 会在实例化控制器时自动注入
- 示例:
public function __construct(UserService $userService)<br>{<br> $this->userService = $userService;<br>}
只要 UserService 类无特殊构造参数或已正确绑定,无需额外配置即可生效。
使用 app() 辅助函数手动解析
适用于临时需要、动态类型或无法通过构造函数注入的场景(如条件分支中按需获取):
- 在控制器方法内直接调用
app('App\Services\UserService')或app()->make(...) - 若已绑定别名(如
$this->app->bind('user.service', UserService::class)),可传入字符串别名 - 注意:频繁使用
app()会降低可测试性,应优先考虑构造函数注入
通过 $this->app 属性访问容器(仅限继承 Controller 的类)
Laravel 6 的基类 Illuminate\Routing\Controller 提供了 $this->app 属性,可在控制器任意方法中使用:
$service = $this->app->make(UserService::class);- 与
app()效果一致,本质是同一容器实例 - 适合在中间件、钩子逻辑或非构造上下文中按需获取服务
绑定服务前需确认注册位置
若自定义服务未被自动解析,需先在服务提供者的 register() 方法中绑定:
- 推荐在
AppServiceProvider的register()中添加:$this->app->bind(UserService::class, function ($app) {<br> return new UserService($app->make(UserRepository::class));<br>}); - 接口绑定示例:
$this->app->bind(UserRepositoryInterface::class, EloquentUserRepository::class); - 确保对应类文件存在、命名空间正确、且已运行
composer dump-autoload


















