comphp/service-management

一个健壮的PHP服务管理库,提供PSR-11兼容的只读访问点来访问服务。

v0.2.2 2024-08-04 20:43 UTC

This package is auto-updated.

Last update: 2024-09-04 20:48:51 UTC


README

CommonPHP的服务管理器是管理并注入PHP应用程序中服务的综合解决方案。它提供了一个优雅且强大的API,允许您管理服务生命周期、注册和检索服务,以及与其他功能的交互。

功能

  • 自动依赖注入
  • 单例和短暂的服务生命周期
  • 别名和接口绑定
  • 基于命名空间的服务注册
  • 自定义服务提供者
  • 为需要额外实例化步骤的服务和服务提供者提供引导接口

ServiceManager 与 ServiceContainer

为了使服务和利用的逻辑分离并保持清晰的架构,我们将这些职责分为两个主要类:ServiceManagerServiceContainer

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);

这检索已注册服务的实例。

注册别名

ServiceManageraliases 属性是 AliasRegistry 的实例,允许您注册服务别名

$services->aliases->register(MyInterface::class, MyClass::class);

在此示例中,MyInterface 被别名为 MyClass。因此,当服务请求 MyInterface 时,将返回一个 MyClass 的实例。

注册命名空间

ServiceManagernamespaces 属性是 NamespaceRegistry 的实例,允许您注册整个命名空间

$services->namespaces->register('MyNamespace');

注册命名空间中的所有类都被视为服务。

注册服务提供者

ServiceManagerproviders 属性是一个 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进行单元测试。按照以下说明运行测试

  1. 请确保您已安装PHPUnit。如果没有,您可以使用Composer安装它

    composer require --dev phpunit/phpunit
  2. 导航到项目的根目录。

  3. 使用以下命令运行测试

    ./vendor/bin/phpunit tests
  4. 如果测试成功,您将看到类似以下输出的内容

    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文件。