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');