laravel 6服务容器支持接口、抽象类绑定到具体实现,实现自动依赖注入;可在appserviceprovider中用bind/singleton注册,控制器构造函数直接类型提示注入,闭包绑定支持动态逻辑,blade中可用@inject调用。

抽象类绑定的基本方式
在服务提供者(如 AppServiceProvider)的 register() 方法中完成绑定:
-
接口绑定(最常见):
$this->app->bind(EmailServiceInterface::class, SendGridEmailService::class);
每次请求EmailServiceInterface类型时,容器返回一个新的SendGridEmailService实例。 -
抽象类绑定(同样有效):
$this->app->bind(AbstractLogger::class, FileLogger::class);
Laravel 不区分接口或抽象类,只要类型提示匹配,就能完成解析。 -
单例绑定(需共享实例):
$this->app->singleton(CacheInterface::class, RedisCache::class);
整个请求生命周期内只创建一次实例,适合无状态的共享服务。
控制器/服务中使用抽象类注入
只要绑定已注册,Laravel 就能通过构造函数类型提示自动注入对应实现:
class OrderController extends Controller
{
private $emailService;
public function __construct(EmailServiceInterface $emailService)
{
$this->emailService = $emailService;
}
public function process()
{
$this->emailService->send('order@shop.com', 'Your order is confirmed');
}
}
无需手动调用 app()->make(),框架自动完成解析与注入。
带参数或动态逻辑的绑定(闭包方式)
当实现类构造函数需要运行时参数(如配置项、环境变量),用闭包绑定更灵活:
- 例如:根据
config('mail.driver')动态选择邮件服务:$this->app->bind(EmailServiceInterface::class, function ($app) {<br> $driver = $app->make('config')->get('mail.driver');<br> return match($driver) {<br> 'smtp' => new SmtpEmailService(),<br> 'sendgrid' => new SendGridEmailService(),<br> default => new LogOnlyEmailService(),<br> };<br> });
视图中注入抽象类(Blade @inject)
在 Blade 模板里也可直接使用绑定的抽象类:
- 先确保已绑定:
$this->app->bind(UserStatsInterface::class, DatabaseUserStats::class); - 在 Blade 中:
@inject('stats', 'App\Contracts\UserStatsInterface'){{ $stats->activeCount() }}











