1、可通过@inject指令在laravel视图中直接注入服务类,避免控制器传递变量;2、使用@inject(‘alias’, ‘ClassName’)语法实例化服务并调用其方法;3、可注入config服务读取配置项如邮件驱动;4、支持接口与实现分离,先在服务提供者中绑定,再在视图中注入接口获取实现。

如果您在Laravel视图中需要调用某个服务类的方法来获取数据或执行逻辑,但又不想通过控制器传递变量,可以通过@inject指令将服务直接注入到视图中。这种方式适用于需要在多个视图中频繁使用同一服务的场景。
本文运行环境:macBook Pro,macOS Sonoma
一、使用@inject注入内置或自定义服务
通过@inject指令可以在Blade模板中直接实例化服务容器中的绑定类,从而调用其公共方法。该指令接受两个参数:别名和完整类名。
1、在Blade文件中使用@inject语法声明服务实例:
@inject(‘userService’, ‘appServicesUserService’)
2、调用该服务提供的方法输出结果:
{{ $userService->getActiveUsersCount() }}
二、注入配置或辅助服务获取全局值
某些情况下需要在视图中访问配置项、设置信息或其他非请求相关服务,例如获取当前应用名称或邮件驱动类型,可通过注入config服务实现。
1、注入Laravel内置的config服务:
@inject(‘config’, ‘IlluminateConfigRepository’)
2、读取指定配置值:
当前邮件驱动为:{{ $config->get(‘mail.driver’) }}
三、通过服务容器绑定接口与实现并注入
当使用接口与实现分离的设计模式时,可在服务提供者中绑定接口到具体实现类,随后在视图中通过@inject注入接口对应的实现。
1、在AppServiceProvider的register方法中添加绑定:
$this->app->bind( ‘AppContractsPaymentgatewayInterface’, ‘AppServicesStripePaymentService’ );
2、在Blade模板中注入接口别名:
@inject(‘payment’, ‘AppContractsPaymentGatewayInterface’)
3、调用接口定义的方法:
{{ $payment->process() }}


