vvatashi / di
此包已被废弃,不再维护。未建议替代包。
1.0.1
2018-09-08 17:32 UTC
This package is auto-updated.
Last update: 2020-12-05 14:21:44 UTC
README
VVatashi/DI
PHP7中依赖注入容器的简单且最小化实现。特性
- 实现了 PSR-11;
- 代码配置;
- 使用PHP类名作为标识符;
- 使用PHP类型提示进行构造函数参数注入。
安装
使用 composer
composer require vvatashi/di
使用
配置容器
创建一个新的容器
$container = new \VVatashi\DI\Container();
使用工厂函数注册类型
当第一次从容器请求指定的类型时,将调用提供的函数。此函数应创建一个兼容类型的实例,可能对其进行某些配置,然后返回它。
此函数接受容器本身作为单个参数,可以使用它作为服务定位器。
$container->registerCallback(LoggerInterface::class, function ($container) { // Create the Monolog logger for example. $logger = new \Monolog\Logger('test'); $handler = new \Monolog\Handler\StreamHandler('test.log'); $logger->pushHandler($handler); return $logger; });
使用类型名注册类型
假设你有以下类型
interface TestInterface {} class TestClass implements TestInterface { public function __construct(LoggerInterface $logger) { $logger->log('Howdy world!'); } }
你可以将 TestClass
类型注册为当请求 TestInterface
时实例化
$container->registerType(TestInterface::class, TestClass::class);
然后 LoggerInterface
将从容器中自动解析并传递给 TestClass
构造函数。
使用实例注册类型
如果你已经有某种类型的实例,你可以直接注册它
$container->registerInstance(TestInterface::class, $instance);
使用容器
你可以使用 $container->get('class name')
方法将容器用作 服务定位器 并直接从其中实例化某些内容。
然而,这被认为是一种反模式,因为它会强地将你的代码与容器耦合。
在大多数情况下,你应该依赖于构造函数参数的注入。