alex-patterson-webdev / container
PSR-11 依赖注入容器的简单实现
Requires
- php: >=7.4 || >=8.0
- psr/container: ^1
Requires (Dev)
- phpunit/phpunit: ^9.5
Provides
- psr/container-implementation: 1.0.0
This package is auto-updated.
Last update: 2024-08-29 16:24:23 UTC
README
Arp\Container
关于
一个简单的 PSR-11 兼容依赖注入容器
安装
通过 Composer 进行安装。
require alex-patterson-webdev/container ^0.1
使用方法
要开始使用容器,我们只需创建其实例
use Arp\Container\Container;
$container = new Container();
Arp\Container\Container
实现 Psr\ContainerInterface
,因此可以用来通过名称检查和获取服务。
if (true === $container->has('ServiceName')) {
$service = $container->get('ServiceName');
}
在容器中注册服务
我们可以通过多种方式将一个 '服务' 注册到容器中,选择哪种方法取决于您希望如何创建服务。
对象和值
最简单的用例是当您需要向容器中 set()
一个对象或值。这些值不需要实例化,容器将在请求时通过 get()
简单存储和返回这些值。
$container = new Container();
$container->set('TodaysDate', new \DateTime('today'));
$todaysDate = $container->get('TodaysDate');
工厂
工厂提供了一个位置来使用容器构建和解析依赖关系。工厂可以是任何 PHP callable
,并且可以通过调用 $container->setFactory()
设置。
$container = new Container();
$container->setFactory('TodaysDate', static function() {
return new \DateTime('today');
});
当调用工厂类时,它还将容器作为第一个参数注入其中。我们可以使用容器来解析其他依赖。
$container->setFactory('TodaysDateService', static function(ContainerInterface $container) {
return new TodayDateService($container->get('TodaysDate');
});
我们还可以访问请求的服务名称作为第二个参数,$name
。通过了解正在创建的服务名称,这允许创建可重用的工厂。
$factory = static function(ContainerInterface $container, string $name) {
$todaysDate = $container->get('TodaysDate');
if ('EnglishDateService' === $name) {
return new EnglishDateService($todaysDate);
}
return new FrenchDateService($todaysDate);
};
然后我们可以将相同的工厂分配给不同的服务名称。
$container->setFactory('EnglishDateService', $factory);
$container->setFactory('FrenchDateService', $factory);
对象工厂
在不需要依赖项的服务的情况下,我们可以使用 Arp\Container\Factory\ObjectFactory
,容器将根据服务的 $name
创建类。如果服务的 $name
不是一个有效的类名,将抛出异常。
use Arp\Container\Factory\ObjectFactory;
$container = new Container();
$container->setFactory(\stdClass(), ObjectFactory::class);
// @var \stdClass $object
$object = $container->get(\stcClass());
上述配置不是必需的,因为任何使用 FQCN 的服务 $name
如果未在容器中注册,将自动注册为使用 ObjectFactory
。我们建议您明确定义服务以提高清晰度.
单元测试
可以使用 PHPUnit 执行项目的单元测试
php vendor/bin/phpunit