在 laravel 6 的 artisan 命令中,推荐使用 app() 辅助函数获取服务容器实例;也可通过 $this->getapplication() 获取应用对象并调用 make() 方法;或在构造函数中依赖注入容器或具体服务,但需避免在 register() 中提前使用未绑定的服务。

在 Laravel 6 的命令行环境中(如 Artisan 命令),获取服务容器实例的方式与 HTTP 请求中基本一致,但需注意执行上下文差异——命令行请求同样会初始化完整的应用容器,只是不经过中间件和路由层。
直接使用 app() 辅助函数
这是最常用、最推荐的方式。Laravel 6 的 app() 函数在 Artisan 命令的 handle() 方法内完全可用:
- 无需额外引入或判断,只要命令类继承
Illuminate\Console\Command(默认即如此)即可直接调用 - 例如:
$cache = app('cache');或$db = app()->make('db'); - 该方式返回的是当前运行中的唯一容器实例,与 Web 请求共享同一生命周期(单次命令执行周期)
通过 $this->getApplication() 获取
Artisan 命令类本身可通过 getApplication() 方法访问底层应用对象,再从中提取容器:
-
$app = $this->getApplication();返回的是Illuminate\Foundation\Application实例 - 它本身就是容器,因此可直接调用
$app->make('log')等方法 - 注意:不要误用
$this->app—— 命令类自身没有这个属性;$this->laravel在部分自定义命令中可能被手动设置,但非标准做法
在 Command 的构造函数中依赖注入
Laravel 6 支持在命令类构造函数中类型提示容器或具体服务,由容器自动解析注入:
- 例如:
public function __construct(\Illuminate\Contracts\Foundation\Application $app) - 也可注入具体服务:
public function __construct(CacheContract $cache, Mailer $mailer) - 这种方式更利于测试,且语义清晰;但要注意避免在构造中触发耗时操作(如连接数据库),因为命令尚未进入 handle 阶段
避免在 register() 中提前使用容器
若你在自定义服务提供者的 register() 方法中编写 Artisan 命令逻辑(极少见),需特别注意:
- 此时容器尚处于注册阶段,部分服务可能还未绑定,调用
app()->make()可能失败 - 应将实际使用逻辑移至
boot()方法,或延迟到命令handle()中执行 - 尤其避免在
register()里调用需要已解析服务(如 config、log)的方法











