berlioz/service-container

Berlioz Service Container 是一个遵守 PSR-11(容器接口)标准的 PHP 库,用于通过依赖注入管理您的服务。

v2.3.0 2024-03-26 10:47 UTC

README

Latest Version Software license Build Status Quality Grade Total Downloads

Berlioz Service Container 是一个遵守 PSR-11(容器接口)标准的 PHP 库,用于通过依赖注入管理您的服务。

有关更多信息,以及 Berlioz 框架的使用,请访问网站和在线文档:https://getberlioz.com

安装

Composer

您可以使用 Composer 安装 Berlioz Service Container,这是推荐的安装方式。

$ composer require berlioz/service-container

依赖项

  • PHP ^8.0
    • psr/container
    • psr/simple-cache

使用方法

容器

PSR-11 提供的方法

  • get($id)

    PSR-11:通过标识符查找容器中的条目并返回它。

    接受一个类名。

  • has($id)

    PSR-11:如果容器可以为给定的标识符返回条目,则返回 true。否则返回 false。

添加服务

您可以使用 Container::add() 方法添加服务。

use Berlioz\ServiceContainer\Container;

$container = new Container();
$service = $container->add(MyService::class, 'alias'); // Returns a Berlioz\ServiceContainer\Service\Service object

或者使用方法 Container::addService(),它接受一个 Service 对象。

use Berlioz\ServiceContainer\Container;
use Berlioz\ServiceContainer\Service\Service;

$container = new Container();
$service = new Service(MyService::class, 'alias');
$container->addService($service);

服务对象

  • Service::public function __construct(
        string|object $class,
        ?string $alias = null,
        callable|string|null $factory = null,
        ?CacheStrategy $cacheStrategy = null,
    )
    

    服务对象的构造函数。

  • Service::setNullable(bool $nullable = true): Service

    服务可以在工厂执行后为 null(默认为 false)。

  • Service::setShared(bool $shared = true): Service

    共享服务,总是返回相同的实例。

  • Service::addProvide(string ...$provide): Service

    通过服务添加提供的类/接口/别名。

  • Service::addArgument(string $name, mixed $value): Service

    添加参数以创建服务类实例。

  • Service::addArguments(array $arguments): Service

    它是一个参数数组,键必须是参数名称,键的值必须是参数值。

  • Service::addCall(string $method, array $arguments = []): Service

    在对象类构造后立即调用的方法(及其参数)。

  • Service::addCalls(array $calls = []): void

    它是一个调用数组,键必须是调用的方法名称,值是一个参数数组。

  • Service::setFactory(string $factory): Service

    这是用于创建对象的工厂静态方法。

    示例:MyProject\Name\Space\MyFactory::service

实例化器

创建类或对象的新实例

use Berlioz\ServiceContainer\Instantiator;

$instantiator = new Instantiator();
$object = $instantiator->newInstanceOf(
    MyClass::class,
    [
        'argument1' => 'Value',
        'argument3' => 'Value',
        'argument2' => 'Value'
    ]
);

调用方法

use Berlioz\ServiceContainer\Instantiator;

$instantiator = new Instantiator();
$instantiator->invokeMethod(
    $myObject,
    'myMethodName',
    [
        'argument1' => 'Value',
        'argument3' => 'Value',
        'argument2' => 'Value'
    ]
);

调用函数

use Berlioz\ServiceContainer\Instantiator;

$instantiator = new Instantiator();
$instantiator->invokeFunction(
    'myFunctionName',
    [
        'argument1' => 'Value',
        'argument3' => 'Value',
        'argument2' => 'Value'
    ]
);

在所有示例中,最后一个参数是传递给构造函数、方法或函数的参数数组。参数的顺序不重要。

如果参数是对象,系统将将其放入容器或尝试实例化该类。

方法 Container::call() 根据值调用实例化器的正确方法。

use Berlioz\ServiceContainer\Container;

$container = new Container();
$container->call(fn() => 'test'); // Call closure
$container->call(MyClass::class); // Instantiate the class
$container->call(MyClass::method); // Call static method or instantiate the class and call method 

Inflector

如果您想通过实现接口的方法注入一些依赖项,那么 Inflector 是非常有用的。

use Berlioz\ServiceContainer\Container;
use Berlioz\ServiceContainer\Inflector\Inflector;

$inflector = new Inflector(
    MyInterface::class, // Interface implemented by object
    'setFoo', // Method to call
    [/*...*/] // Arguments
);
$container = new Container();
$container->addInflector($inflector);

服务提供者

在某些情况下,例如性能限制,您需要添加一个服务提供者。

服务提供者需要实现 \Berlioz\ServiceContainer\Provider\ServiceProviderInterface 接口。抽象类 \Berlioz\ServiceContainer\Provider\AbstractServiceProvider 可以帮助您。

服务提供者的示例

use Berlioz\ServiceContainer\Container;
use Berlioz\ServiceContainer\Provider\AbstractServiceProvider;

class MyServiceProvider extends AbstractServiceProvider
{
    // Declare services class and alias
    protected array $provides = [stdClass::class, 'service'];
    
    public function boot(Container $container) : void
    {
        // This method is called when provider is added to container.
        // Add inflectors here.
    }
    
    public function register(Container $container) : void
    {
         // Add services here
         $container->add(stdClass::class, 'service');
    }
}

添加您的服务提供者

use Berlioz\ServiceContainer\Container;

$container = new Container();
$container->addProvider(new MyServiceProvider());

$container->has('service'); // Returns TRUE
$container->get('service'); // Returns an `stdClass` instance