kris-ro / php-dependency-injection
PHP 依赖注入容器
v1.0.0
2024-09-14 19:07 UTC
Requires
- php: 8.*
- kris-ro/php-config: ^1.0
Requires (Dev)
- kris-ro/php-database-model: ^1.0
- kris-ro/validator: ^1.0
- phpunit/phpunit: ^10.5
README
PHP 依赖注入容器类。扩展 kris-ro/php-config 功能并依赖于它进行配置。
安装
使用 composer 安装 PHP 依赖注入容器。
composer require kris-ro/php-dependency-injection
配置
Container 从由 Container::buildConfig() 构建的配置数组中读取请求服务的定义。
所有服务必须在配置数组的 services 分支中定义。每个服务通过其服务标识符(以下示例中的 service_identifier)来识别。
定义数组中的第一个键必须是包含类名(带命名空间前缀,可选地带有方法名后缀)的 class。有效示例
{
"services" : {
"service_identifier" : {
"class" : "\\Class\\With\\Namespace"
},
"another_service_identifier" : {
"class" : "\\Class\\With\\Namespace::MethodName"
}
}
}
class 可以由定义数组中的其他条目跟随,表示将要执行的创建服务的实例方法(按照在定义中列出的顺序执行)。有效示例
{
"services" : {
"myPDO" : {
"class": "\\PDO",
"_construct": {
"dsn": "mysql:host=localhost;dbname=test",
"username": "k",
"password": "123456"
}
},
"validator" : {
"class": "\\KrisRo\\Validator\\Validator",
"createRegexRules" : {
"rules": {
"alphanumeric": "/^[a-z0-9\\-_]+$/i"
}
}
}
}
}
如上所示,对于 myPDO,指定了 _construct,因为它需要这三个参数。
第二个定义 validator 也指定了一个带有单个参数 rules 的方法。
定义中的 参数名称 来自方法。
如果你查看上面的 PDO 定义,你会看到 _constructor 有三个参数 dsn、username 和 password,它们分别映射到 PDO 构造函数参数 $pdo、$username 和 $password。
有三种 参数值类型
- 一个 服务标识符,前缀为字符
@ - 一个来自配置数组的 条目路径,前缀为字符
# - 其他一切按原样传递
作为参数的服务credentialsOrPDO 的值引用 myPDO 服务。
{
"services" : {
"myPDO" : {
"class": "\\PDO",
"_construct": {
"dsn": "mysql:host=localhost;dbname=test",
"username": "k",
"password": "123456"
}
},
"model" : {
"class": "\\KrisRo\\PhpDatabaseModel\\Model",
"_construct": {
"credentialsOrPDO": "@myPDO"
}
}
}
}
来自配置数组的条目路径rules 的值引用配置数组中的 validator > rules 条目。
{
"validator" : {
"rules": {
"alphanumeric": "/^[a-z0-9\\-_]+$/i"
}
},
"services" : {
"validator": {
"class": "\\KrisRo\\Validator\\Validator",
"_construct": {
"rules": "#validator/rules"
}
}
}
}
使用方法
一旦定义了服务,它就非常简单
use KrisRo\PhpDependencyInjection\Container; # first build the configuration array. See more at https://github.com/kris-ro/php-config Container::buildConfig('/absolute/path/to/your/folder/with/json/files'); # load the service you need $pdo = Container::service('myPDO'); $model = Container::service('model'); $validator = Container::service('validator');