CommonPHP DependencyInjection是一个简单且健壮的PHP应用程序依赖注入容器。它简化了对象的动态创建、方法的调用、函数的调用以及属性的填充。

v0.2.1 2024-08-04 03:27 UTC

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进行单元测试。请按照以下说明运行测试

  1. 请确保已安装PHPUnit。如果没有,您可以使用Composer安装它

    composer require --dev phpunit/phpunit
  2. 导航到项目的根目录。

  3. 使用以下命令运行测试

    ./vendor/bin/phpunit tests
  4. 如果测试成功,您将看到类似以下输出

    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文件。