ryanl / flexer
Flexer 是一个强大的 PHP 库,它提供了 PSR-11 容器接口的灵活实现。Flexer 设计用于提供一个无缝且标准化的方式来管理 PHP 应用程序中的依赖和服务,为开发者提供灵活且直观的容器解决方案。
v0.0.1
2024-06-26 20:46 UTC
Requires
- php: ^8.2
- psr/container: ^2.0
Requires (Dev)
- pestphp/pest: ^2.23
- phpstan/phpstan: ^1.10
- spatie/ray: ^1.41
- squizlabs/php_codesniffer: ^3.7
- vimeo/psalm: ^5.15
Provides
README
描述
这是一个简单但强大的 PSR11 实现,支持多种依赖定义类型
入门
类似于 PHP-DI 所做的操作
安装
使用 Composer 安装 Flexer
composer require ryanl/flexer
使用方法
实例化容器的一个实例
$container = new \Flexer\Container();
有了自动装配,Flexer 可以处理大多数对象实例化的情况。以下是 Flexer 可以通过 零配置 覆盖的情况列表。
具有以下特征的类
- 没有构造函数
- 空构造函数
- 具有可选参数的构造函数
- 构造函数参数是符合上述情况的类的对象。
定义如何实例化复杂对象
向 Flexer 添加定义有两种可能的语法
直接在构造函数中
$container = new \Flexer\Container([ $id => $definition ]);
使用 add
方法
$container = new \Flexer\Container(); $container->add($id, $definition)
标识符
标识符可以按照 PSR-11 的定义,是“要查找条目的标识符”,因此可以是任意标识符。然而,最常见的方法是使用完全限定的类名(包括其命名空间)。
$container = new \Flexer\Container(); $container->add(\Test\Sample\NormalClass::class, $definition)
定义
定义是提供给容器的实例化你的类的指令。目前,Flexer 接受以下类型的 $definition
- 闭包
$definition = fn() => new \Test\Sample\NormalClass(); $container->add($id, $definition);
- 函数名
function getNormalClassInstance(): \Test\Sample\NormalClass { return new \Test\Sample\NormalClass(); } $container->add($id, 'getNormalClassInstance');
- 类闭包对象
$container->add($id, \Test\Sample\NormalClass::create(...));
- 对象实例
$container->add($id, new \Test\Sample\NormalClass());
尽管有众多定义依赖的方式,但我们建议使用延迟选项,仅在需要时才实例化依赖,以避免不必要的内存分配。
提示
管理定义的一种更优雅的方法是将它们分离到一个提供定义数组的文件中
# dependencies.php <?php declare(strict_types=1); return [ \Test\Sample\NormalClass::class => fn () => new \Test\Sample\NormalClass(), \PDO::class => function (): \PDO { return new PDO('sqlite::memory'); } ];
# index.php <?php declare(strict_types=1); $container = new \Flexer\Container(require_once 'dependencies.php');
测试
要执行测试套件,请克隆存储库,然后在 composer.json 上运行 test
脚本
git clone https://github.com/ryanlimadotdev/flexer.git
composer install
composer test
贡献
任何愿意且有空闲时间与项目合作的人都可以自由创建项目的分支,并提交他们认为相关的修改的拉取请求建议。只需注意执行适当的测试并遵循项目中现有的代码风格政策即可。
composer analyse