comphp / service-management
一个健壮的PHP服务管理库,提供PSR-11兼容的只读访问点来访问服务。
Requires
- php: ^8.3
- comphp/di: ^v0.2
- psr/container: ^2.0
Requires (Dev)
- phpunit/phpunit: ^9.5.23
README
CommonPHP的服务管理器是管理并注入PHP应用程序中服务的综合解决方案。它提供了一个优雅且强大的API,允许您管理服务生命周期、注册和检索服务,以及与其他功能的交互。
功能
- 自动依赖注入
- 单例和短暂的服务生命周期
- 别名和接口绑定
- 基于命名空间的服务注册
- 自定义服务提供者
- 为需要额外实例化步骤的服务和服务提供者提供引导接口
ServiceManager 与 ServiceContainer
为了使服务和利用的逻辑分离并保持清晰的架构,我们将这些职责分为两个主要类:ServiceManager 和 ServiceContainer。
ServiceManager 负责服务的注册、实例化和一般管理。它作为服务的中心,在这里定义服务、解决依赖关系和管理生命周期。它旨在在应用程序的引导或启动阶段使用。
相反,ServiceContainer 设计为在应用程序执行期间消费这些服务。它为通过 ServiceManager 管理的服务提供了一个简化、只读的接口。这种做法允许显式且清晰地区分服务配置和消费,促进更干净、更易于维护的代码。
要求
CommonPHP框架需要PHP 8.1或更高版本。此库具有以下依赖项
comphp/di包:此库基于comphp/di依赖注入包构建,并且是此服务管理库正常运行所必需的。
安装
您可以使用 Composer 安装 CommonPHP\ServiceManagement
composer require comphp/service-management
基本用法
服务管理器的主体类是 CommonPHP\ServiceManager\ServiceManager。首先创建一个新的 ServiceManager 实例
$services = new CommonPHP\ServiceManager\ServiceManager();
ServiceManager 实例提供了用于管理和检索服务的方法。
注册服务
您可以使用 register 方法注册服务
$services->register(MyClass::class);
这通过类名注册服务。然后,您可以使用 get 方法(如下所示)检索服务的实例。
检索服务
使用 get 方法检索服务
$instance = $services->get(MyClass::class);
这检索已注册服务的实例。
注册别名
ServiceManager 的 aliases 属性是 AliasRegistry 的实例,允许您注册服务别名
$services->aliases->register(MyInterface::class, MyClass::class);
在此示例中,MyInterface 被别名为 MyClass。因此,当服务请求 MyInterface 时,将返回一个 MyClass 的实例。
注册命名空间
ServiceManager 的 namespaces 属性是 NamespaceRegistry 的实例,允许您注册整个命名空间
$services->namespaces->register('MyNamespace');
注册命名空间中的所有类都被视为服务。
注册服务提供者
ServiceManager 的 providers 属性是一个 ProviderRegistry 的实例,允许您注册服务提供者。
$services->providers->registerProvider(MyServiceProvider::class);
服务提供者是实现了 ServiceProviderContract 的类,负责提供服务的实例。
服务引导
需要某些在实例化时执行的操作,而这些操作不能仅由构造函数处理的服务的可以实现 BootstrapperContract。当这样的服务被 ServiceManager 实例化时,它的 bootstrap 方法会自动被调用。
class MyService implements BootstrapperContract { public function bootstrap(ServiceManager $serviceManager): void { // Bootstrap logic goes here } } $services->register(MyService::class); $instance = $services->get(MyService::class); // MyService's bootstrap method will be called
服务提供者引导
类似地,需要在实例化时执行某些操作的服务提供者也可以实现 BootstrapperContract。它们的 bootstrap 方法在它们被实例化时也会自动被调用。
class MyServiceProvider implements ServiceProviderContract, BootstrapperContract { public function bootstrap(ServiceManager $serviceManager): void { // Bootstrap logic goes here } // Implement other methods from ServiceProviderContract... } $services->providers->registerProvider(MyServiceProvider::class); // MyServiceProvider's bootstrap method will be called
在这两个示例中,bootstrap 方法是打算由 ServiceManager 内部调用的,不应手动调用,以防止出现意外的行为。
文档
请参阅示例目录,以获取有关如何使用服务管理器提供的每个功能的更详细的示例。
API 参考
API 参考
这是 API 的高级概述。有关类、方法和属性的详细信息,请参阅源代码和相应的 PHPDoc 注释。
-
CommonPHP\ServiceManagement\ServiceManager:主服务管理类,提供对所有服务管理功能的访问。-
AliasRegistry $aliases:服务别名注册表。允许通过备用名称检索服务。 -
NamespaceRegistry $namespaces:服务命名空间注册表。允许通过命名空间检索服务。 -
ProviderRegistry $providers:服务提供者注册表。允许通过提供者检索服务。 -
ServiceContainer $di:服务的依赖注入容器。 -
register(string $class, array $params = []): void:通过类名注册服务,可选参数。 -
set(string $name, object $instance): void:在服务容器中存储一个命名实例。 -
get(string $name, array $params = []): object:检索服务的实例。 -
has(string $name): bool:检查服务是否已注册。
-
-
CommonPHP\ServiceManagement\ServiceContainer:依赖注入容器的类,允许服务检索其他服务。-
get(string $name, array $params = []): object:检索服务的实例。 -
has(string $name): bool:检查容器中是否有服务可用。
-
-
CommonPHP\ServiceManagement\Contracts\ServiceProviderContract:创建自定义服务提供者的接口。-
supports(string $className): bool:检查此提供者是否可以支持给定的类。 -
handle(string $className, array $parameters = []): object:处理创建支持类的实例。 -
isSingletonExpected(string $className): bool:检查服务是否预期为单例。
-
-
CommonPHP\ServiceManagement\Support\AliasRegistry:管理服务别名的类。-
has(string $alias): bool:检查别名是否已注册。 -
get(string $alias): string:检索与别名关联的类名。 -
register(string $alias, string $class): void:注册新别名。
-
-
CommonPHP\ServiceManagement\Support\NamespaceRegistry:管理服务命名空间的类。-
matches(string $className): bool:检查类名是否与已注册的命名空间匹配。 -
register(string $namespace): void:注册新命名空间。
-
-
CommonPHP\ServiceManagement\Support\ProviderRegistry:管理服务提供者的类。-
registerProvider(string $providerClass): void:注册新服务提供者。 -
hasProvider(string $providerClass): bool:检查服务提供者是否已注册。 -
getProvider(string $providerClass): ServiceProviderContract:检索已注册服务提供者的实例。 -
getProviderFor(string $className): ServiceProviderContract:检索支持给定类的服务提供者。 -
supports(string $className): bool: 检查提供者是否支持特定类。 -
get(string $className, array $parameters = []): object: 从提供者检索服务实例。
-
-
CommonPHP\ServiceManagement\Contracts\BootstrapperContract: 需要额外实例化步骤的服务接口。bootstrap(ServiceManager $serviceManager): void: 执行服务所需的初始化动作。此方法仅由服务管理器内部调用。
示例
以下是使用CommonPHP\ServiceManager的一些示例。您可以在本仓库的examples目录中找到这些示例的完整源代码。
-
别名注册:演示如何使用别名注册来创建服务的别名(见
examples/aliases.php)。 -
命名空间注册:演示如何使用命名空间注册来注册命名空间,使得该命名空间下的所有类都被视为服务(见
examples/namespaces.php)。 -
服务容器:演示如何将服务容器传递给服务,为它们提供请求其他服务的方式(见
examples/service-container.php)。 -
服务提供者:演示如何创建和注册自定义服务提供者以提供服务的实例(见
examples/service-providers.php)。 -
初始化服务:演示如何创建和使用实现BootstrapperContract的服务(见
examples/bootstrapping.php)。
贡献
欢迎贡献!请首先阅读贡献指南。
测试
此项目使用PHPUnit进行单元测试。按照以下说明运行测试
-
请确保您已安装PHPUnit。如果没有,您可以使用Composer安装它
composer require --dev phpunit/phpunit
-
导航到项目的根目录。
-
使用以下命令运行测试
./vendor/bin/phpunit tests
-
如果测试成功,您将看到类似以下输出的内容
PHPUnit 9.6.9 by Sebastian Bergmann and contributors. Time: 00:00.374, Memory: 6.00 MB OK (29 tests, 36 assertions) Process finished with exit code 0
我们建议在开发过程中定期运行这些测试,以帮助早期发现潜在问题。我们还努力追求高测试覆盖率,代码库中的添加应理想地包括相应的测试。
为了获得更详细的输出或集成到持续集成(CI)系统中,PHPUnit可以生成各种格式的日志文件。有关更多信息,请参阅PHPUnit文档。
许可证
此项目采用MIT许可证。有关详细信息,请参阅LICENSE.md文件。