@inject 是 Blade 的语法糖,用于将容器实例绑定到模板变量,仅在当前模板作用域有效,不支持构造函数注入或传参,适用于轻量无副作用的服务调用如格式化、翻译等。
@inject 是 Blade 提供的语法糖,本质是将服务容器中的实例绑定到模板变量上。它不是“注入”到视图类本身,而是让 Blade 编译器在渲染前帮你从容器里 app() 出来并赋值给一个变量——所以它只在当前模板作用域有效,且不支持构造函数注入那种生命周期管理。
@inject?当你需要在 Blade 模板中直接调用服务方法,又不想把逻辑提前塞进控制器或 view composer 里时,比如:
NotificationService)CdnUrlGenerator)MoneyFormatter),且格式规则随 locale 变化注意:如果该服务需要访问 request / session / auth 等运行时上下文,确保它本身是「每次解析都新建」或「request-scoped」绑定的,否则可能复用旧实例导致状态错乱。
@inject 的写法和常见错误语法是 @inject('variableName', 'Fully\Qualified\Service\Class'),两个参数都必须是字符串字面量,不能拼接、不能变量插值。
常见错误包括:
@inject($userRepo, 'App\Repositories\UserRepository') —— 变量名不能带 $,且必须是纯字符串@inject(repo, App\Repositories\UserRepository) → Blade 会当成函数调用报错App\Services\LoggerService 没在 AppServiceProvider::register() 里 $this->app->singleton() 过,运行时报 Target class [App\Services\LoggerService] does not exist
正确写法示例:
@inject('userRepository', 'App\Repositories\UserRepository')
@inject('formatter', 'App\Services\MoneyFormatter')
@inject?它方便,但有明显局限:

@inject('cache', 'Illuminate\Contracts\Cache\Factory', ['ttl' => 3600]) —— 第三个参数不被支持@inject('paymentService') 直接在模板里调用 ->createOrder() —— 这属于严重违反关注点分离更推荐的做法是:把服务结果提前准备好,通过 with() 或 compact() 传入视图。只有当服务调用极其轻量、无副作用、且复用率高(如翻译、格式化)时,@inject 才值得考虑。
真正容易被忽略的一点:Blade 模板是缓存编译的,@inject 绑定的变量名一旦在模板中定义,就无法被子模板或 include 覆盖——哪怕你在 @include('partials.header') 里再写一遍 @inject('formatter', ...),也只会用第一次声明的实例。