此包最新版本(0.1.0)没有提供许可证信息。

PSR-11 依赖注入容器的简单实现

0.1.0 2023-05-29 13:42 UTC

This package is auto-updated.

Last update: 2024-08-29 16:24:23 UTC


README

Build Status codecov Scrutinizer Code Quality

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