haszi / dicontainer
此包的最新版本(1.0.0)没有可用的许可证信息。
PSR-11 兼容的依赖注入容器的学习练习
1.0.0
2023-10-28 12:52 UTC
Requires
- php: >=8.0
- psr/container: ^2.0
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.4
- vimeo/psalm: ^5.15
This package is auto-updated.
Last update: 2024-09-28 15:44:35 UTC
README
这是一个基本的 PSR-11 兼容依赖注入容器,旨在学习对象组合、生命周期管理和 DIC 提供的拦截概念和实现。已实现基本对象组合和生命周期管理功能(请参阅功能和限制),不支持对管理对象调用的拦截。
需求
PHP 8.0+
安装
使用 Composer 安装
composer require haszi/dicontainer
入门
创建容器
use haszi\DI\Container; $container = new Container();
PSR-11 兼容性
if ($container->has('MyClass')) { $myObject = $container->get('MyClass'); }
注册临时服务
临时服务(每次从容器获取时都返回一个新实例)可以使用表示类名的字符串或闭包进行注册。
类名
$container->set('comment', Comment::class);
闭包
$container->set(Comment::class, function () { return new Comment(); });
注册共享服务
共享服务(每次从容器获取时都返回相同实例)可以使用表示类名的字符串、闭包或已实例化的对象进行注册。所有共享服务对象都是首次使用时懒加载初始化的。
类名
$container->setShared('database', DatabaseConnection::class);
闭包
$container->setShared(DatabaseConnection::class, function () { return new DatabaseConnection(); });
已实例化的对象
$db = new DatabaseConnection(); $container->setShared(DatabaseConnection::class, $db);
注册作用域服务
作用域服务与共享服务相同,区别在于可以清除实例化的对象而不注销服务本身。作用域服务的常见用途是事件循环中的请求对象。
类名
$container->setScoped('request', Request::class);
闭包
$container->setScoped(Request::class, function () { return new Request(); });
已实例化的对象
$request = new Request(); $container->setScoped(Request::class, $request);
清除已初始化的作用域对象
$container->unsetScopedInstances(Request::class);
注销服务
$container->unset(DatabaseConnection::class);
功能
支持
- 对象组合
- 构造函数注入
- 自动绑定
- 构造函数注入
- 生命周期管理
- 临时服务(每次获取请求返回新对象)
- 共享服务(每次获取请求返回相同对象)
- 作用域服务(每次获取请求返回相同对象,且实例化的对象是可丢弃的)
不支持
- 对象组合
- 设置器和属性注入
- 注入
- 联合和交集类型
- 向内置类型(数组、可调用、布尔值、浮点数、整数、字符串、迭代器、对象、混合)传递值
- 拦截