Zit 是一个基于 Pimple 的简单依赖注入器。它旨在提供与 Pimple 相同的简单性,同时提供更健壮的对象接口。

3.0.1 2021-06-21 15:02 UTC

This package is auto-updated.

Last update: 2024-09-09 13:47:07 UTC


README

Build Status Packagist Version GitHub Stars PHP 5.4+

Zit 是一个基于 Pimple 的简单依赖注入器。它旨在提供与 Pimple 相同的简单性,同时提供更健壮的对象接口。

安装

Zit 通过 Composer 提供

composer require syberisle/zit

使用

Zit 很容易使用。与 Pimple 类似,对象是通过匿名函数定义的,该函数返回对象的实例

$container = new \Zit\Container();
$container->set('auth', function() {
	return new Auth();
});

所有实例化函数都将容器作为第一个参数传递,这使得依赖注入成为可能

$container->set('auth', function($container) {
	return new Auth($container->get('db'));
});

Zit 还提供方便的魔术方法来设置实例化函数

$container->setAuth(function() { /* ... */ }); // Or:
$container->set_auth(function() { /* ... */ });

获取对象

获取对象就像这样简单

$container->get('auth');

或者,如果你喜欢简写

$container->getAuth(); // Or:
$container->get_auth();

获取新对象

默认情况下,所有对象在 Zit 中都是共享的。也就是说,一旦创建了对象,就会返回相同的对象,对于每个额外的 get()。如果您需要新对象,可以使用以下方式

$container->fresh('auth'); // Or:
$container->freshAuth(); // Or:
$container->fresh_auth(); // Or:
$container->newAuth(); // Or:
$container->new_auth();

注意,因为 'new' 关键字是保留的,所以您只能使用魔术方法。

构造函数参数

有时您需要将参数传递给对象的构造函数,同时还需要注入依赖项。Zit 自动将所有参数传递到您的实例化函数中

$container->setUser(function($c, $id)) {
	$user = new User($id);
	$user->setDb($c->getDb());
	return $user;
});

$user = $container->newUser(1);

// Parameters are taken into account when caching results:
$user2 = $container->getUser(1); // $user2 === $user;

存储静态内容

您还可以使用 Zit 来存储字符串/对象等。只需传递它而不是生成器即可

$container->set('api_key', 'abcd1234567890');
$key = $container->get('api_key');

请注意:如果您想要返回可调用对象而不是可调用对象的返回值,则必须使用实例化函数包装可调用对象。

自定义容器

大多数项目都将从设置自己的注入规则的定制容器中受益。这只需要扩展 Zit 即可

namespace MyApp\Di;

class Container extends \Zit\Container
{
	public function __construct()
	{
		$this->setAuth(function() { /* ... */ });
		$this->setUser(function() { /* ... */ });
	}
}

变更日志

版本 3.0.0

  • 实现了 容器互操作性。Zit 已经是 container-interop 兼容的,但它现在实现了接口,并在找不到项目时抛出一个实现 Interop\Container\Exception\NotFoundException 的异常。这个异常扩展了 \InvalidArgumentException,所以 3.0.0 应该接近 100% 兼容性,但我还是将主版本号进行了升级。
  • 放弃了 PHP 5.3 的支持
  • 删除了已弃用的函数 setParam
  • setFactory() 现在接受任何 callable 而不是特定的 Closure
  • 修复了从 __call 抛出的异常信息中的错误
  • set() 现在是流畅的(返回容器以进行链式操作)
  • 切换到 md4 哈希以提高速度(我们不需要 md5 的安全性)
  • 在代码中添加了 DocBlocks

版本 2.0

  • 为了检查传递给 set 的参数是否是可调用的,删除了 setParam 方法。
  • 添加了 "Factory" 变体。如果您设置了以 "factory" 结尾的对象,这可能会引起向后兼容性问题。
  • 更新了 delete 方法,以便清除对象、回调和工厂,这也可能导致一些不寻常的向后兼容性问题。