syberisle / zit
Zit 是一个基于 Pimple 的简单依赖注入器。它旨在提供与 Pimple 相同的简单性,同时提供更健壮的对象接口。
3.0.1
2021-06-21 15:02 UTC
Requires
- php: >=5.4.0
- container-interop/container-interop: ^1.1
Replaces
- inxilpro/zit: >=3.0.0
This package is auto-updated.
Last update: 2024-09-09 13:47:07 UTC
README
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
方法,以便清除对象、回调和工厂,这也可能导致一些不寻常的向后兼容性问题。