vertilia / container
Vertilia 服务容器实现
v1.2.0
2023-05-28 14:26 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, ];
在这里,您可以使用不同的格式来指定如何创建特定类的对象
-
通过回调实例化。定义一个回调,该回调将返回一个新的对象实例。在我们的例子中,当我们请求 EnvMockInterface 时,我们将收到一个 EnvMock 实例。
-
通过服务名称数组实例化。如果对象创建需要列表中的其他对象作为构造函数参数,我们提供它们的名称在数组中。这样容器将首先实例化这些依赖项,然后调用类构造函数,将依赖项作为参数传递。在我们的情况下,容器将按以下方式进行
return new ServiceMock(new EnvMock);
(这里的EnvMockInterface::class
依赖关系将通过之前的规则解决)。 -
通过允许额外参数的回调实例化。与第一个规则相同的回调,但具有额外的参数。当特定对象需要传递到构造函数的额外参数时,请使用此形式。您可以指定固定数量的参数或使用 php-5.6 特定的
...
操作符。 -
也可以像最后三个例子那样只返回现有的对象和标量。
您可以根据需要拥有尽可能多的规则文件,因此您的应用程序中的每个模块都可以带有自己的描述。
步骤 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 性有很大帮助。