本文目录导读:

在 PHP 中,“服务提供者”这个概念最常出现在 Laravel 框架中(类似 Java Spring 的 Bean 注册机制),也存在于一些其他框架(如 Symfony 的 Bundle)或自定义 IoC 容器(依赖注入容器)中。
下面我分 Laravel 和 通用模式 两种情况来解释,并附上代码示例。
Laravel 中的服务提供者 (Service Provider)
这是 Laravel 的核心概念,所有框架核心服务(如数据库、队列、缓存)和应用级服务,都是通过服务提供者 注册 和 引导 的。
作用
- 注册:将类或接口绑定到服务容器。
- 引导:完成服务的初始化(如注册事件监听器、中间件、路由等)。
如何创建一个服务提供者
步骤 1:使用 Artisan 命令生成
php artisan make:provider MyServiceProvider
会在 app/Providers/MyServiceProvider.php 生成文件。
步骤 2:编写 register 和 boot 方法
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Services\PaymentService;
use App\Contracts\PaymentGatewayInterface;
use App\Gateways\StripeGateway;
class MyServiceProvider extends ServiceProvider
{
// 在容器中注册绑定(延迟加载)
public function register(): void
{
// 绑定接口到具体实现
$this->app->bind(PaymentGatewayInterface::class, StripeGateway::class);
// 绑定一个单例
$this->app->singleton(PaymentService::class, function ($app) {
return new PaymentService($app->make(PaymentGatewayInterface::class));
});
}
// 所有服务提供者注册完成后执行(引导阶段)
public function boot(): void
{
// 注册路由、事件监听、视图合成器等
// 注册一个监听器
// Event::listen(UserRegistered::class, SendWelcomeEmail::class);
}
}
步骤 3:在 config/app.php 的 providers 数组中注册
'providers' => [
// 其他服务提供者...
App\Providers\MyServiceProvider::class,
],
步骤 4:使用服务
// 在控制器或任意需要的地方 $payment = app(PaymentService::class); $payment->charge(100);
延迟提供者(Deferred Providers)
如果服务只在特定场景使用,可以设置为延迟加载,提高性能。
protected $defer = true; // 标记为延迟
public function provides(): array
{
return [PaymentService::class]; // 返回该提供者注册的服务
}
自定义服务提供者(通用模式)
如果你没有使用 Laravel,而是自己实现一个简易的依赖注入容器,也可以编写一个“服务提供者”类来集中管理绑定。
定义容器
class Container
{
protected array $bindings = [];
public function bind(string $abstract, callable $concrete): void
{
$this->bindings[$abstract] = $concrete;
}
public function make(string $abstract)
{
if (isset($this->bindings[$abstract])) {
return call_user_func($this->bindings[$abstract], $this);
}
throw new Exception("Service not found: $abstract");
}
}
定义服务提供者接口
interface ServiceProviderInterface
{
public function register(Container $container): void;
public function boot(): void;
}
实现一个具体的服务提供者
class LoggerServiceProvider implements ServiceProviderInterface
{
use ProvidesDeferredServices; // 可选的延迟加载 trait
public function register(Container $container): void
{
$container->bind(LoggerInterface::class, function ($c) {
return new FileLogger('/var/log/app.log');
});
}
public function boot(): void
{
// 初始化配置、注册事件等
}
}
在应用启动时注册
$container = new Container();
$providers = [
new LoggerServiceProvider(),
new DatabaseServiceProvider(),
];
// 先全部注册
foreach ($providers as $provider) {
$provider->register($container);
}
// 再全部引导
foreach ($providers as $provider) {
$provider->boot();
}
常见框架中的类似概念
| 框架 | 对应概念 | 说明 |
|---|---|---|
| Laravel | ServiceProvider | 核心,用于注册服务、引导应用 |
| Symfony | Bundle | 类似,但更重,包含配置、路由、模板等 |
| Yii2 | Bootstrap | 配置文件的 bootstrap 数组,用于启动时加载服务 |
| 原生 PHP | 自定义 Provider 类 | 可自行实现上述结构 |
- Laravel 中:
php artisan make:provider→ 在register()里绑定服务 → 在boot()里执行引导 → 配置到config/app.php。 - 通用 PHP:定义一个
ServiceProviderInterface,在应用启动时统一注册和引导。
服务提供者的本质是 解耦服务的创建与使用,让服务容器管理依赖,便于测试和扩展。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播