renakdup/simple-dic

一个简单的DI容器,具有自动装配功能,适用于您的WordPress应用程序,无任何依赖项。

1.2.2 2024-08-20 22:14 UTC

README

UnitTests Test Coverage PHPStan

Latest Stable Version PHP Version Require Total Downloads

一个简单的DI容器,具有单文件内的 自动装配 功能,无任何依赖项,允许您轻松地在PHP应用程序中使用它,特别是方便用于 WordPress 插件和主题。

为什么选择Simple DI容器

  1. 易于集成到您的WordPress项目中 - 只需复制一个文件或通过Composer安装。
  2. 不依赖于其他脚本或库。
  3. 支持为类以及具有默认值的标量类型自动装配 __constructor 参数。
  4. 支持PHP ^7.4|^8。
  5. 帮助您遵循开发代码的最佳实践。
  6. 无PHPCS冲突。
  7. 支持懒加载类实例化。
  8. 轻量级且快速。

如何在项目中安装

有几种方式,您可以选择您更喜欢的

通过Composer安装

composer require renakdup/simple-php-dic

复制并粘贴文件

  1. 只需将文件 ./src/Container.php 复制到您的插件目录或主题中。
  2. 更改文件中的 namespace
    Renakdup\SimpleDIC 更改为 <Your_Plugin_Name>\SimpleDIC
  3. 包含文件。

如何使用它

开始使用

  1. 创建容器实例。
  2. 设置服务
  3. 获取服务
  4. 使用对象
use Renakdup\SimpleDIC\Container;

// create container
$container = new Container();

// set service
$container->set( Paypal::class, function () {
    return new Paypal();
} );

// get service
$paypal = $container->get( Paypal::class );

// use this object
$paypal->pay();

SimpleDIC允许为容器设置原始类型的值

$container->set( 'requests_limit', 100 );
$container->set( 'post_type', 'products' );
$container->set( 'users_ids', [ 1, 2, 3, 4] );

$user_ids = $container->get( 'users_ids', [ 1, 2, 3, 4] );

方法 get() 可以解决在 $container 中未设置的对象,并将解析结果保存到 $container 中。这意味着当您多次运行 $container->get($service) 时,您将获得相同的对象。

$obj1 = $constructor->get( Paypal::class );
$obj2 = $constructor->get( Paypal::class );
var_dump( $obj1 === $obj2 ) // true

如果您想多次实例化服务,请使用 make() 方法。

工厂

工厂是一个包装创建实例的 匿名函数
允许配置对象如何创建,并允许在工厂中使用 Conainer 实例。

$container->set( Paypal::class, function () {
    return new Paypal();
} );

同样,工厂以懒加载模式创建对象。这意味着对象将在您使用 get() 方法解析时创建。

$container->set( Paypal::class, function () {
    return new Paypal();
} );

$paypal = $constructor->get( Paypal::class ); // PayPal instance created

工厂内的容器

SimpleDIC 允许在工厂回调 ( Container $c ) 中添加参数以在工厂内部获取或解析其他服务以构建对象。

$container->set( 'config', [
    'currency' => '$',
    'environment' => 'production',
] );

$container->set( Paypal::class, function ( Container $c ) {
    return new Paypal( $c->get('config') );
} );

自动装配

SimpleDIС 的自动装配功能允许 Container 自动创建和注入依赖项。

我将通过一个示例来展示

class PayPalSDK {}
class Logger {}

class Paypal {
    public function __constructor( PayPalSDK $pal_sdk, Logger $logger ) {
        //...
    }
}

然后当您创建 Paypal::class 时,您运行 $container->get(Paypal::class)Container 识别构造函数中的所有类并解析它们。就像它是

new Paypal( new PayPalSDK(), new Logger() );

容器自动装配可以解析构造函数中 原始 参数的默认值

class Logger {
    public function __constructor( $type = 'filestorage', $error_lvl = 1 ) {
        //...
    }
}

您可以使用允许 Container 创建需要类 __constructor 的实例以及解析构造函数依赖项的 自动装配 功能。

注意

但是,如果对象创建更复杂且需要配置,并且您在构造函数中没有默认值的参数,则需要使用 factory 为准备服务。

每次创建实例

方法 make() 通过其名称解析服务。它每次返回服务的新实例,并支持自动装配。

$conatainer->make( Paypal::class );

注意

构造函数的依赖项不会每次都实例化。
如果在之前已经解决了依赖,则它们将作为已解决的依赖项传递。

考虑以下示例

class PayPalSDK {}

class Paypal {
    public PayPalSDK $pal_sdk;
    public function __constructor( PayPalSDK $pal_sdk ) {
        $this->pal_sdk = $pal_sdk;
    }
}

// if we create PayPal instances twice
$paypal1 = $container->make( Paypal::class );
$paypal2 = $container->make( Paypal::class );

var_dump( $paypal1 !== $paypal2 ); // true
var_dump( $paypal1->pal_sdk === $paypal2->pal_sdk ); // true

PayPal服务的依赖项不会被重新创建,而是从已解决的对象中获取。

PSR11 兼容性

进行中

路线图

  • 添加带有配置的绑定服务
  • 在DIC中添加注册类的自动装配
  • 为自动填充添加默认原始值的自动装配
  • 添加支持可调用的类
  • 在Container.php中添加PSR11接口
  • 为未绑定的类添加自动装配支持
  • 添加已解决服务存储(获取单例)
  • 添加每次创建服务新实例的能力
  • 提高性能
  • 修复PHP8中的已弃用代码:使用ReflectionParameter::getType(),应使用ReflectionType API。
  • 默认绑定$container实例。
  • 添加remove方法。
  • 循环依赖保护器。

锦上添花

  • 将CI与运行中的自测试集成
  • 添加通过测试的徽章
  • 添加PHPStan分析器
  • 添加代码覆盖率徽章
  • 为函数添加代码描述。
  • 选择代码风格
  • 在packegist上添加
  • 在Container文件中添加如果类存在检查?
  • 将Container.php重命名为SimpleContainer.php
  • 当处于调试模式时显示堆栈跟踪?
  • PHP 8命名参数和自动装配。
  • 允许通过__constructor设置定义。
  • 添加支持代码驱动的IoC。
  • 添加Container的配置。
  • 添加性能基准

许可协议

Software License

MIT许可(MIT)。请参阅许可文件以获取更多信息。