luoluolzb/di
Composer 安装命令:
composer require luoluolzb/di
包简介
luoluolzb's Dependency Injection Container
关键字:
README 文档
README
一个简单而实用的psr-11依赖注入容器。
A simple dependency injection container for psr-11.
安装
使用 composer 安装:
composer require luoluolzb/di
使用
实例化
使用容器之前需要实例化:
<?php use luoluolzb\di\Container; $container = new Container();
注入实体
使用set($id, $entity)方法注入一个实体,实体可以是一个函数(注入服务),可以是一个类实例(不推荐直接注入类实例,应该使用在函数中注册),还可以是其他任何类型:
// 注入匿名函数 $container->set('logger', function($c) { $logger = new Monolog\Logger; $logger->pushHandler(new Monolog\Handler\StreamHandler('app.log', Logger::WARNING)); return $logger; }); // 注入类实例 $container->set('myClass', new MyClass()); // 注入数组 $container->set('configs', ([ 'db' => [ 'type' => 'mysql', 'host' => 'localhost', 'dbname' => 'test', 'port' => '3306', 'user' => 'root', 'password' => '123456', ], ]); // 注入标量 $container->set('isExists', true);
如果注入的实体为一个匿名函数,那么我们可以使用匿名函数的第一个参数访问容器实例:
$container->set('pdo', function($c) { // $c 为容器实例 $c = $c->get('configs')['db']; $dsn = "{$c['type']}:host={$c['host']};port={$c['port']};dbname={$c['dbname']};"; return new PDO($dsn, $c['user'], $c['password']); });
还可以在实例化的时候一次注入多个实体:
$container = new Container([ 'logger' => function($c) { $logger = new Monolog\Logger; $logger->pushHandler(new Monolog\Handler\StreamHandler('app.log', Logger::WARNING)); return $logger; }, 'myClass' => new MyClass(), 'configs' => [ 'db' => [ 'type' => 'mysql', 'host' => 'localhost', 'dbname' => 'test', 'port' => '3306', 'user' => 'root', 'password' => '123456', ], ], ]);
工厂方式注入实体
使用 set 或者数组式注入实体时,每次取出的都为同一对象实例,想要每次取出时都重新创建实例使用 factory 方法:
// 注入匿名函数 $container->factory('myClass', function($c) { return MyClass(); });
如果是通过构造函数一次注入了多个实体,想要使用工厂方式需提供第二个参数指定实体:
$container = new Container([ 'logger' => function($c) { $logger = new Monolog\Logger; $logger->pushHandler(new Monolog\Handler\StreamHandler('app.log', Logger::WARNING)); return $logger; }, 'myClass' => function($c) { return MyClass(); }, ], [ 'logger' => true, ]);
这样就将 myClass 指定为工厂创建模式,其他的仍然为单一实例模式。
获取实体
使用get($id)方法从容器中获取一个实体:
$logger = $container->get('logger'); $logger->info('some info');
注意:如果要取出的实体为一个匿名函数或者其他可调用的类型,那么该匿名函数每次取出时都会调用。如果需要使用单例模式应该这样注入:
$container->set('db', function($c) { return Db::getInstance(); });
如果要取出的实体为其他类型(非可调用类型),那么会直接返回原来注入的实体。
删除实体
从容器中删除一个实体使用delete($id)方法:
$container->delete('logger');
判断实体是否存在
判断容器中是否存在某个实体使用has($id)方法:
if ($container->has('logger')) { // ... } else { // ... }
像数组一样访问容器
容器实现了ArrayAccess接口,因此可以像访问数组的方式来访问容器:
// 注入实体 $container['configs'] = [ 'db' => [ 'type' => 'mysql', 'host' => 'localhost', 'dbname' => 'test', 'port' => '3306', 'user' => 'root', 'password' => '123456', ], ]; // 获取实体 $dbConf = $container['configs']['db']; // 删除实体 unset($container['configs']); // 判断实体是否存在 $ret = isset($container['configs']);
容器中实体数量
使用容器的count()方法获取容器中实体数量:
$count = $container->count();
容器实现了Countable接口,还可以直接使用PHP的count()函数()获取实体数量:
$count = count($container);
luoluolzb/di 适用场景与选型建议
luoluolzb/di 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 35 次下载、GitHub Stars 达 0, 最近一次更新时间为 2019 年 07 月 25 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「container」 「di」 「PSR-11」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 luoluolzb/di 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 luoluolzb/di 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 luoluolzb/di 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Facilitates the routine step of bootstrapping PHP applications.
A fast and intuitive dependency injection container.
PSR-11 Aura.DI container configurator for Laminas and Mezzio applications. Drop-in replacement for the archived laminas/laminas-auradi-config with PHP 8.4 and 8.5 support.
Symfony compiler pass that allows to use service providers as defined in container-interop/service-provider
Dependency injection container for the Monolith framework.
The PSR-11 container bridges
统计信息
- 总下载量: 35
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 0
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2019-07-25