webiik/container

容器为大多数Pimple函数添加了便捷的方法,并将容器中的依赖自动注入到类构造函数中。

1.1 2021-07-02 13:05 UTC

This package is auto-updated.

Last update: 2024-09-29 05:28:16 UTC


README

容器

容器为大多数Pimple函数添加了便捷的方法,并将容器中的依赖自动注入到类构造函数中。

安装

composer require webiik/container

示例

$container = new \Webiik\Container\Container();
$container->addService('\Webiik\Arr\Arr', function () {
    return new \Webiik\Arr\Arr();
});
$array = $container->get('\Webiik\Arr\Arr');

添加

addService

addService(string $name, callable $factory): void

addService() 将服务工厂添加到容器。它总是返回相同的服务实例。

$container->addService('\Webiik\Arr\Arr', function () {
    return new \Webiik\Arr\Arr();
});

如果需要在 $factory 内部访问容器

$container->addService('Service', function ($container) {
    // $container - Container    
});

addServiceFactory

addServiceFactory(string $name, callable $factory): void

addServiceFactory() 将服务工厂添加到容器。它总是返回新的服务实例。

$container->addService('\Webiik\Arr\Arr', function () {
    return new \Webiik\Arr\Arr();
});

addParam

addParam(string $name, $val): void

addParam() 将参数添加到容器。

$container->addParam('foo', 'bar');

addFunction

addFunction(string $name, callable $function): void

addFunction() 将函数添加到容器。

$container->addFunction('myFn', function ($a, $b) {
    return $a * $b;
});

检查

isIn

isIn(string $name): bool

isIn() 检查服务、参数或函数是否存储在容器中。

$container->isIn('\Webiik\Arr\Arr');

获取

get

get(string $name)

get() 从容器中返回服务、参数或函数。

$array = $container->get('\Webiik\Arr\Arr');

依赖注入

容器通过方法 injectTo(string $className): array 提供从容器到类控制器的自动依赖注入。然而,它需要遵循以下命名约定

按类名注入服务

  1. 添加与底层类全名相同名称的服务
    $container->addService('\Webiik\Arr\Arr', function () {
       return new \Webiik\Arr\Arr();   
    });
  2. 在您的类控制器中使用全类名作为类型参数
    public function __construct(\Webiik\Arr\Arr $array)
    {
        $this->array = $array;
    }

    容器将搜索名称为 \Webiik\Arr\Arr 的服务。

  3. 向类注入依赖项
    $myClass = new MyClass(...$container->injectTo('MyClass'));

按服务名注入服务

  1. 添加名称匹配以下正则表达式的服务 ws[A-Z]
    $container->addService('wsArray', function () {
       return new \Webiik\Arr\Arr();   
    });
  2. 向您的类添加类名别名
    use Webiik\Arr\Arr as wsArray;
  3. 在您的类控制器中添加带参数类型的文档块
    /**
    * @param wsArray $array
    */   
    public function __construct(wsArray $array)
    {
        $this->array = $array;
    }

    容器将搜索名称为 wsArray 的服务。

  4. 从容器向您的类注入依赖项
    $myClass = new MyClass(...$container->injectTo('MyClass'));

注入函数或参数

  1. 添加任何名称的参数
    $container->addFunction('myFnName', function() {
        echo 'Hello!';
    });
  2. 在您的类构造函数中使用参数名称
    public function __construct($myFnName)
    {
        $myFnName(); // Hello
    }

    容器将搜索名称为 myParamName 的参数。

  3. 从容器向您的类注入依赖项
    $myClass = new MyClass(...$container->injectTo('MyClass'));

注入容器本身

  1. 在您的类构造函数中使用完整的容器类名作为类型参数
    public function __construct(\Webiik\Container\Container $container)
    {
        $this->container = $container;
    }
  2. 从容器向您的类注入依赖项
    $myClass = new MyClass(...$container->injectTo('MyClass'));

资源