laravel 6 中视图不应直接调用服务容器,而应使用 @inject 指令安全注入服务;支持注入具体类、内置服务(如 config、auth)或接口绑定实现,严禁在 blade 中使用 app() 或 app::make() 等方式手动解析。

用 @inject 注入具体服务类
这是最推荐、最清晰的方式。你只需指定一个别名和完整类名,Blade 就会从容器中解析该服务(支持自动依赖注入)。例如,你想在首页显示活跃用户数:
- 在 Blade 文件顶部写:@inject('userService', 'App\Services\UserService')
- 然后直接调用:{{ $userService->getActiveCount() }}
注意:UserService 必须已在服务提供者中正确绑定(默认构造函数依赖也会被自动解析)。
注入内置服务(如 config、auth、cache)
Laravel 内置服务已预绑定,可直接注入使用,无需额外注册。比如读取配置项:
- @inject('config', 'Illuminate\Config\Repository')
- 当前环境:{{ $config->get('app.env') }}
再比如检查当前用户是否登录(需确保 auth 已启动):
- @inject('auth', 'Illuminate\Auth\AuthManager')
- {{ $auth->check() ? '已登录' : '未登录' }}
注入接口并依赖容器绑定
适合解耦设计,比如支付网关有多个实现(微信/支付宝),通过接口统一调用。前提是在 AppServiceProvider@register() 中绑定:
$this->app->bind(
'App\Contracts\PaymentInterface',
'App\Services\AlipayService'
);
然后在 Blade 中:
- @inject('pay', 'App\Contracts\PaymentInterface')
- {{ $pay->getGatewayName() }}
不推荐的做法(避免踩坑)
- ❌ 在 Blade 中写 app()->make('App\Services\SomeService') —— 破坏模板职责,难以测试,且绕过 @inject 的语义化管理
- ❌ 使用 App::make() 或 resolve() —— 同样模糊意图,且 Facade 在视图中易引发作用域问题
- ❌ 把复杂逻辑(如查询数据库、发起 HTTP 请求)放进视图 —— 违反 MVC 分离原则,性能与可维护性双降











