borschphp/container

一个简单的PSR-11容器实现。

1.1.2 2024-05-14 19:22 UTC

This package is auto-updated.

Last update: 2024-09-14 20:04:20 UTC


README

Build Latest Stable Version License

为您的Web项目提供一个轻量级且易于使用的PSR-11容器。

安装

通过 composer

composer require borschphp/container

用法

use Borsch\Container\Container;

$container = new Container();

// Add your dependencies
$container->set('db', fn() => new PDO('mysql:host=localhost;dbname=mydb', 'user', 'password'));

// Retrieve your dependencies
$db = $container->get('db');

参数化依赖

在这个例子中,我们在一个名为 db 的条目中定义一个PDO服务。

然后,我们按照构造函数的顺序设置参数的值
PDO::__construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null)) :

最后,我们检索PDO服务。

use Borsch\Container\Container;

$container = new Container();

$container
    ->set('db', PDO::class)
    ->addParameter('mysql:host=localhost;dbname=mydb')
    ->addParameter('user')
    ->addParameter('password');

$db = $container->get('db');

共享和非共享依赖

在这个例子中,我们定义了一个默认情况下共享的logger服务。
我们检索了logger服务两次,因此我们可以看到这两个实例是相同的。

use Borsch\Container\Container;

$container = new Container();

$container
    ->set('logger', fn() => new Logger())
    ->cache(true);

$logger1 = $container->get('logger');
$logger2 = $container->get('logger');

// $logger1 and $logger2 are the same instances

默认情况下自动装配

在这个例子中,我们创建了一个需要实例化一个Logger实例的自定义类

class MyApp
{
    public function __construct(
        protected Logger $logger
    ) {}
}

我们在容器中创建了一个名为Logger::class的条目,并使用闭包来实例化它。
我们在容器中创建了一个名为MyApp::class的条目;由于我们没有提供第二个参数,容器将尽力从环境中获取所需的参数(在这里,是一个Logger)。

use Borsch\Container\Container;

$container = new Container();

$container->set(Logger::class, function () {
    $logger = new Logger('app');
    $logger->pushHandler(new StreamHandler('path/to/log/file.log'));

    return $logger;
})-> cache(true);

$container->set(MyApp::class);

$app = $container->get(MyApp::class);

// $app is instantiated with the logger from entry Logger::class

在定义中使用容器获取依赖

假设我们在容器中定义了一个PDO::class,并想使用PdoAdapter在Symfony CacheInterface中使用它。
我们可以简单地通过在函数参数中请求它来获取我们定义的PDO::class实例。

use Borsch\Container\Container;

$container = new Container();
$container->set(PDO::class, function () {
    $pdo = new PDO('sqlite:/path/to/my/database.sqlite');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    return $pdo;
})->cache(true);

$container->set(
    CacheInterface::class,
    // PDO instance defined upper will be injected here as parameter
    fn(PDO $pdo) => new PdoAdapter($pdo)
)->cache(true);

许可证

该软件包采用MIT许可证。有关更多信息,请参阅许可证文件