vertilia/container

Vertilia 服务容器实现

v1.2.0 2023-05-28 14:26 UTC

This package is auto-updated.

Last update: 2024-08-28 17:29:27 UTC


README

提供 psr/container-implementation 的基本服务容器实现。

也称为依赖注入容器或服务定位器。

有关更多信息,请参阅 PSR-11

用例

步骤 1:定义一个规则列表来创建所需类型的对象

<?php

// services.php

namespace Vertilia\Container;

return [
    // instantiating via callback
    EnvMockInterface::class => function () {
        return new EnvMock();
    },

    // instantiating via array of service names
    ServiceMock::class => [EnvMockInterface::class],

    // instantiating via callback with additional params allowed
    'ServiceMockAlias' => function (...$args) {
        return new ServiceMock($this->get(EnvMockInterface::class), ...$args);
    },

    // returning existing object
    'ServiceMockObject' => (object) 'test string',

    // returning string value
    'ServiceMockString' => 'test string',

    // returning other scalar value
    'ServiceMockInt' => 42,
];

在这里,您可以使用不同的格式来指定如何创建特定类的对象

  1. 通过回调实例化。定义一个回调,该回调将返回一个新的对象实例。在我们的例子中,当我们请求 EnvMockInterface 时,我们将收到一个 EnvMock 实例。

  2. 通过服务名称数组实例化。如果对象创建需要列表中的其他对象作为构造函数参数,我们提供它们的名称在数组中。这样容器将首先实例化这些依赖项,然后调用类构造函数,将依赖项作为参数传递。在我们的情况下,容器将按以下方式进行

    return new ServiceMock(new EnvMock);(这里的 EnvMockInterface::class 依赖关系将通过之前的规则解决)。

  3. 通过允许额外参数的回调实例化。与第一个规则相同的回调,但具有额外的参数。当特定对象需要传递到构造函数的额外参数时,请使用此形式。您可以指定固定数量的参数或使用 php-5.6 特定的 ... 操作符。

  4. 也可以像最后三个例子那样只返回现有的对象和标量。

您可以根据需要拥有尽可能多的规则文件,因此您的应用程序中的每个模块都可以带有自己的描述。

步骤 2:使用规则文件列表实例化 ServiceContainer

<?php

// bootstrap.php

$app = new \Vertilia\Container\ServiceContainer([__DIR__ . '/services.php']);

现在,您可以请求 $app 服务容器返回所需类别的对象。它将采取所有必要的行动来在它的存储中找到它或创建它(如果需要)。

$svc = $app->get(\Vertilia\Container\ServiceMock::class);

print_r($svc->env);

请参阅 tests/ 中的更多用法示例。

最后注意

服务容器与依赖注入技术一起,对从我们的应用程序中删除单例、解耦我们的代码、使其更具可测试性和 SOLID 性有很大帮助。