简单而强大的PSR-11兼容Di容器

v2.4.0 2023-09-19 20:55 UTC

README

Latest Stable Version License ci.yml Coverage Status

简单的PSR-11兼容Di容器

要求

  • php: >=7.4
  • psr/container: ~1.0 || ~2.0

安装

使用以下命令安装最新版本:

composer require 'corpus/di'

用法

使用Di开始,以下是最重要的三个方法。

  • 使用set方法设置返回的项目或用于懒加载构建的lambda,可选项地接受构造函数参数。
  • 使用get方法用于在初始的懒加载后检索值,具有记忆功能。
  • 使用getNew用于在每次调用时调用懒加载创建lambda,可选项地接受一个包含构造函数参数的数组作为第二个参数。
<?php

require 'vendor/autoload.php';

$di = new \Corpus\Di\Di;

// Eager Loading
$di->set('foo', new Foo);

$di->get('foo'); // the Foo instance from above

// --- --- --- --- --- ---

// Lazy Loading
$di->set('bar', function () {
	return new Bar;
});

// Value is memoized, new Bar() is only called once at first `get`.
$bar1 = $di->get('bar');
$bar2 = $di->get('bar');

// --- --- --- --- --- ---

// Constructor Parameters
$di->set('baz', function ( $qux ) {
	return new Baz($qux);
});

// Calling getNew explicitly avoids the memoization. Constructor params passed as array.
$baz  = $di->getNew('baz', [ 'corge' ]);
$baz2 = $di->getNew('baz', [ 'grault' ]);

// --- --- --- --- --- ---

// Auto-Constructor Parametrization
$di->set('qux', Qux::class);

$qux1 = $di->get('qux'); // New instance of Qux
$qux2 = $di->get('qux'); // Memoized instance of Qux

// --- --- --- --- --- ---

// Lazy Loading with auto-arguments.
$di->set('quux', function ( Qux $qux ) {
	return new Quux($qux);
});

$quux = $di->get('quux'); // Instance of Quux given the previous instance of Qux automatically

// --- --- --- --- --- ---

// getMany lets you retrieve multiple memoized values at once.
[$foo, $bar] = $di->getMany([ 'foo', 'bar' ]);

// getManyNew lets you retrieve multiple new values at once, providing for arguments.
[$baz, $baz2] = $di->getManyNew([ [ 'baz', [ 'corge' ] ], [ 'baz', [ 'grault' ] ] ]);

$di->callFromReflectiveParams(function (Bar $bar, Baz $baz){
	// Callable called with parameters automatically populated based on their name
	// $bar => 'bar'
});

// Construct a class auto-populating constructor parameters based on their name
$controller1 = $di->constructFromReflectiveParams(MyController::class);
$controller2 = $di->constructFromReflectiveParams('MyController');

文档

类:\Corpus\Di\Di

方法:Di->getMany

function getMany(array $ids) : array

检索多个项目;如果存在则缓存。与list()一起使用。

参数
  • string[] $ids - 项目名称/键
返回
  • array

方法:Di->get

function get($id)

通过标识符查找容器中的条目并返回它。

参数
  • string $id - 要查找的条目的标识符。

抛出: \Psr\Container\NotFoundExceptionInterface - 对于此标识符没有找到条目。

抛出: \Psr\Container\ContainerExceptionInterface - 获取条目时出错。

返回
  • mixed - 条目。

方法:Di->getManyNew

function getManyNew(array $data) : array

检索多个项目。与list()一起使用。

参数
  • array[] $data - 包含项目(名称/键/参数)对元组的数组

抛出: \InvalidArgumentException

返回
  • array

方法:Di->getNew

function getNew(string $id [, array $args = []])

检索一个项目

参数
  • string $id - 项目的名称/键
  • array $args

抛出: \Corpus\Di\Exceptions\UndefinedIdentifierException

方法:Di->duplicate

function duplicate(string $src, string $dest)

将给定值克隆到第二个键

参数
  • string $src - 来源
  • string $dest - 目的地

方法:Di->set

function set(string $id, $value)

通过键存储一个值以供以后检索

参数
  • string $id - 项目的名称/键
  • mixed $value - 要存储的值

方法:Di->has

function has($id) : bool

如果容器可以为给定的标识符返回条目,则返回true。

否则返回false。

has($id)返回true并不意味着get($id)不会抛出异常。
但它确实意味着get($id)不会抛出NotFoundExceptionInterface

参数
  • string $id - 要查找的条目的标识符。
返回
  • bool

方法:Di->raw

function raw(string $id)
参数
  • string $id - 要检索的名称/键

抛出: \Corpus\Di\Exceptions\UndefinedIdentifierException

方法:Di->constructFromReflectiveParams

function constructFromReflectiveParams(string $className [, array $initials = []]) : object

使用反射来执行具有自动填充参数的类的构造函数

参数
  • string $className - 要构建的类
  • array $initials - 参数的有序列表,用于在构造函数上填充初始参数

方法:Di->callFromReflectiveParams

function callFromReflectiveParams(callable $callable [, array $initials = []])

使用反射来执行具有自动填充参数的可调用对象

参数
  • array $initials - 参数的有序列表,用于在可调用对象上填充初始参数
返回
  • mixed - 可调用对象的返回值。

类:\Corpus\Di\Exceptions\UndefinedIdentifierException

当尝试检索不存在的键时抛出。