comphp / di
CommonPHP DependencyInjection是一个简单且健壮的PHP应用程序依赖注入容器。它简化了对象的动态创建、方法的调用、函数的调用以及属性的填充。
Requires
- php: ^8.3
Requires (Dev)
- phpunit/phpunit: ^9.5.23
This package is auto-updated.
Last update: 2024-09-04 03:44:59 UTC
README
CommonPHP\DependencyInjection
是一个简单而强大的PHP应用程序依赖注入(DI)容器,允许动态创建新对象、调用方法、调用函数和填充属性,而无需直接了解目标结构的细节。
特性
- 构造函数和方法注入:自动解析依赖关系以实例化类和调用方法。
- 值查找器:一个支持DI过程的类,帮助在实例化过程中发现和管理参数值。
- 循环依赖处理:一个实例化栈,防止递归依赖链引起的问题。
- 可定制的参数查找:通过添加自定义查找钩子来增强默认的查找过程。
- 填充对象属性:将值分配给对象的属性,处理各种可见性和类型场景。
- 异常处理:一系列特定异常,有助于调试与DI和实例化相关的问题。
要求
CommonPHP框架要求PHP 8.3或更高版本。此库具有以下依赖项
- PHP的内置Reflection类,广泛用于实例化类、调用方法和读取类型信息。
安装
您可以使用Composer安装CommonPHP\DependencyInjection
。
composer require comphp/di
基本用法
实例化类
主要组件是DependencyInjector
类,它负责将传递的参数注入到构造函数、方法或函数中。
<?php require_once 'vendor/autoload.php'; use CommonPHP\DependencyInjection\DependencyInjector; $injector = new DependencyInjector(); // Instantiate a class $exampleClass = $injector->instantiate(ExampleClass::class); // Invoke a method $result = $injector->invoke($exampleClass, 'exampleMethod'); // Call a function or closure $result = $injector->call('exampleFunction');
填充对象属性
DependencyInjector
还可以填充对象的属性
<?php require_once 'vendor/autoload.php'; use CommonPHP\DependencyInjection\DependencyInjector; $injector = new DependencyInjector(); $object = new stdClass(); $values = ['property1' => 'value1', 'property2' => 'value2']; // populate public properties only $injector->populate($object, $values); // populate all properties $injector->populate($object, $values, false);
自定义查找钩子
ValueFinder
类允许您添加自定义查找钩子
<?php require_once 'vendor/autoload.php'; use CommonPHP\DependencyInjection\DependencyInjector; $injector = new DependencyInjector(); $injector->valueFinder->onLookup(function (string $name, string $typeName, bool &$found): mixed { if ($typeName == MyClassType::class) { $found = true; return new MyClassType(); } else if ($name == 'specificStringVariable') { $found = true; return 'specificStringValue'; } return null; });
委托类实例化
对于需要特定实例化逻辑的类,DependencyInjector
提供了一个delegate
方法。此方法允许您指定用于创建特定类实例的自定义回调,从而在对象创建过程中提供更大的控制。
<?php require_once 'vendor/autoload.php'; use CommonPHP\DependencyInjection\DependencyInjector; class SpecificClass { private string $customArg1; private string $customArg2; public function __construct(string $customArg1, string $customArg2) { // Custom construction logic here } } $injector = new DependencyInjector(); // Delegate instantiation of SpecificClass to a custom callback $injector->delegate(SpecificClass::class, function($injector, $name, $typeName) { return new SpecificClass('value1', 'value2'); }); // Automatically use the delegate when SpecificClass is needed $instance = $injector->instantiate(InitiatedClass::class);
文档
有关更深入的文档,请参阅Wiki。
API参考
这是API的高级概述。有关类、方法和属性的详细信息,请参阅源代码和相应的PHPDoc注释。
-
CommonPHP\DependencyInjection\DependencyInjector
:库中的主要类。提供实例化类、调用方法、调用函数以及使用自动依赖解析填充属性的方法。-
instantiate(string $class, array $params = []): object
:使用提供的参数实例化一个类。 -
invoke($object, string $method, array $params = [], bool $publicOnly = true): mixed
:使用提供的参数在给定对象上调用一个方法。 -
call(callable $callable, array $params = []): mixed
:使用提供的参数调用一个函数或闭包。 -
populate(object $object, array $values, bool $publicOnly = true): void
:使用给定的值填充对象的属性。
-
-
CommonPHP\DependencyInjection\Support\ValueFinder
:一个辅助类,帮助在实例化过程中发现和管理参数值。onLookup(callable $callback): void
:在查找过程中注册一个回调函数。
示例
以下是使用CommonPHP\DependencyInjection的一些示例。您可以在本存储库的examples
目录中找到这些示例的完整源代码。
-
实例化:此示例展示了如何使用
DependencyInjector::instantiate()
实例化一个类。 -
调用:此示例展示了如何使用
DependencyInjector::invoke()
调用一个方法。 -
调用:此示例展示了如何使用
DependencyInjector::call()
调用一个函数或闭包。 -
填充:此示例展示了如何使用
DependencyInjector::populate()
填充对象的属性。 -
查找钩子:此示例展示了如何使用
ValueFinder::onLookup()
与自定义查找钩子一起使用。
贡献
我们始终欢迎贡献!请先阅读贡献指南。
测试
本项目使用PHPUnit进行单元测试。请按照以下说明运行测试
-
请确保已安装PHPUnit。如果没有,您可以使用Composer安装它
composer require --dev phpunit/phpunit
-
导航到项目的根目录。
-
使用以下命令运行测试
./vendor/bin/phpunit tests
-
如果测试成功,您将看到类似以下输出
PHPUnit 9.6.9 by Sebastian Bergmann and contributors. ...................... 22 / 22 (100%) Time: 00:00.228, Memory: 4.00 MB OK (22 tests, 36 assertions)
我们建议在开发过程中定期运行这些测试,以帮助尽早发现任何潜在问题。我们还力求达到高水平的测试覆盖率,代码库的任何新增内容应理想地包括相应的测试。
对于更详细的输出或集成到持续集成(CI)系统,PHPUnit可以生成各种格式的日志文件。有关更多信息,请参阅PHPUnit文档。
许可证
本项目采用MIT许可证。有关详细信息,请参阅LICENSE.md文件。