renakdup / simple-dic
一个简单的DI容器,具有自动装配功能,适用于您的WordPress应用程序,无任何依赖项。
Requires
- php: ^7.4|^8
Requires (Dev)
- phpstan/extension-installer: ^1.3
- phpstan/phpstan: ^1.10
- phpstan/phpstan-deprecation-rules: ^1.1
- phpunit/phpunit: ^9.6.13
- rregeer/phpunit-coverage-check: ^0.3.1
- symfony/var-dumper: ^5.4
This package is auto-updated.
Last update: 2024-09-25 09:51:47 UTC
README
一个简单的DI容器,具有单文件内的 自动装配 功能,无任何依赖项,允许您轻松地在PHP应用程序中使用它,特别是方便用于 WordPress 插件和主题。
为什么选择Simple DI容器
- 易于集成到您的WordPress项目中 - 只需复制一个文件或通过Composer安装。
- 不依赖于其他脚本或库。
- 支持为类以及具有默认值的标量类型自动装配
__constructor
参数。 - 支持PHP ^7.4|^8。
- 帮助您遵循开发代码的最佳实践。
- 无PHPCS冲突。
- 支持懒加载类实例化。
- 轻量级且快速。
如何在项目中安装
有几种方式,您可以选择您更喜欢的
通过Composer安装
composer require renakdup/simple-php-dic
复制并粘贴文件
- 只需将文件
./src/Container.php
复制到您的插件目录或主题中。 - 更改文件中的
namespace
从Renakdup\SimpleDIC
更改为<Your_Plugin_Name>\SimpleDIC
- 包含文件。
如何使用它
开始使用
- 创建容器实例。
- 设置服务
- 获取服务
- 使用对象
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的配置。
- 添加性能基准
许可协议
MIT许可(MIT)。请参阅许可文件以获取更多信息。