Qube 是一个轻量级且简单的依赖注入容器。

维护者

详细信息

github.com/Amorfx/qube

源代码

问题

资助包维护!
amorfx

v1.0 2023-07-29 16:19 UTC

This package is auto-updated.

Last update: 2024-09-29 18:51:44 UTC


README

Latest Version on Packagist Tests Total Downloads

Qube 是一个轻量级且简单的依赖注入容器。

安装

您可以通过 composer 安装此包

composer require clementdecou/qube

用法

创建容器只需创建一个 Container 实例

use Qube\Container;

$container = new Container();

或者使用辅助函数

use Amorfx\Qube\qube;

$container = qube();

即使调用多次,它也将返回容器的唯一实例。

定义服务

使用唯一标识符注册服务以便以后检索。服务可以是对象或闭包。

$container->set('my_service', new MyService());

使用工厂定义服务

如果服务有多个依赖项,您可以定义一个用于服务的工厂。

use Amorfx\Qube\DependencyInjection\ContainerInterface;

$container->set('my_service', function (ContainerInterface $container) {
    return new MyService($container->get('service1'), $container->get('service2'));
});

注意,匿名函数可以访问当前容器实例,允许引用其他服务或参数。由于对象仅在获取时创建,因此定义的顺序无关紧要。

定义不可共享的服务

默认情况下,每次获取服务时,都会返回相同的实例。如果希望所有调用都返回不同的实例,请使用 share 参数。

$container->set('my_service', new MyService(), false);

现在,每次调用 'my_service' 都会返回该服务的新的实例。

使用标签定义服务

您可以使用特定的标签标记服务。这在您想检索具有相同标签的多个服务时非常有用。

$container->set('my_service', new MyService(), tags: ['tag1', 'tag2']);

检索服务

使用其标识符检索先前注册的服务。

$service = $container->get('my_service');

使用标签检索多个服务

它将返回一个包含所有标记服务的生成器。您可以使用它进行迭代,或使用 iterator_to_array 函数获取数组。

$services = $container->getByTag('tag1');

定义参数

定义参数可以简化从外部配置容器并存储全局值的过程

$container->setParameter('my_param', 'my_value');

检索参数

使用其标识符检索先前注册的参数。

$param = $container->getParameter('my_param'); // return my_value

扩展容器

如果您反复使用相同的库,您可能希望从项目到项目重用一些服务。通过实现 Qube\DependencyInjection\ServiceProviderInterface 将服务打包到提供者中

use Amorfx\Qube\DependencyInjection\ServiceProviderInterface;
use Amorfx\Qube\DependencyInjection\Container;
class ServiceProvider implements ServiceProviderInterface
{
    public function register(Container $container): void
    {
        // register services and parameters or other providers
    }
}

然后注册您的提供者到容器中

$container->registerProviders([new ServiceProvider()]);
// OR
$container->registerProvider(new ServiceProvider());

使用构建器/或配置文件

您可以使用构建器来创建您的容器。它将允许您使用配置文件来定义您的服务和参数。

use Amorfx\Qube\DependencyInjection\ContainerBuilder;
use Amorfx\Qube\quBuilder;

$builder = new ContainerBuilder(configFilePath: __DIR__ . '/config.php');
$container = $builder->get();

// OR use helper function
$container = quBuilder()
->fromConfig(__DIR__ . '/config.php')
->get();

// Or directly from an array
$container = (new ContainerBuilder(config: [...]))->get();

配置文件必须返回一个具有以下结构的数组

return [
    'parameters' => [
        //list of parameter identifier with their value
        'param1' => 'value1',
        // ...
    ],
    
    'services' => [ // list of you services
    
        'service1' => [ // the service identifier
            'object' => // an instance of your service or use factory
            'factory' => function (ContainerInterface $container) {
                // the closure to return your service instance
            },
            'tags' => [], // a list of tags
            'share' => false, // if the service is shareable, default is true
        ],
        // ...
    ],
    
    'providers' => [
        // the list of your providers class name
    ],
];

测试

composer test

变更日志

请参阅 CHANGELOG 了解最近更改的更多信息。

贡献

请参阅 CONTRIBUTING 了解详细信息。

安全漏洞

请参阅 我们的安全策略 了解如何报告安全漏洞。

鸣谢

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件