clementdecou / qube
Qube 是一个轻量级且简单的依赖注入容器。
Requires
- psr/container: ^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.13
- phpbench/phpbench: ^1.2
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.2
- symfony/var-dumper: ^6.3
README
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)。有关更多信息,请参阅 许可证文件。