jonsa / pimple-ioc
从 Pimple 容器中解析类
v1.3.0
2015-10-07 20:54 UTC
Requires
- pimple/pimple: ~3.0
- symfony/event-dispatcher: ^2.5
Requires (Dev)
- phpunit/phpunit: 4.8.*
This package is not auto-updated.
Last update: 2024-09-28 19:03:51 UTC
README
为 Pimple 容器提供类解析器。
本项目受到 Laravel 如何解析其 IoC 容器中类的极大启发。实际上,大部分代码直接来自他们的 Container
类。
安装
使用命令行将 IoC 容器添加到你的 composer.json
文件中。
composer require jonsa/pimple-ioc
使用方法
类解析器在 Pimple 中注册为 ServiceProvider
use Jonsa\PimpleResolver\ServiceProvider; use Pimple\Container; $container = new Container(); $container->register(new ServiceProvider());
这将在容器上注册 make
键,用于解析请求的类。
$instance = $container['make']('Acme\MyClass');
以及 bind
键,用于将定义绑定到具体实现
$container['bind']('Acme\MyInterface', 'Acme\MyClass');
递归解析
类依赖关系递归解析。
interface FooContract {} class Foo implements FooContract {}; class Bar { public function __construct(FooContract $foo) {} } class Baz { public function __construct(Bar $bar) {} } $container['bind']('FooContract', 'FooClass'); $baz = $container['make']('Baz');
定义构造函数参数
要重写类参数,请使用解析方法上的参数数组。
class Log { public function __construct(Psr\Log\LoggerInterface $logger, $level = Psr\Log\LogLevel::WARNING) { ... } } $container['make']('Log', array( 'level' => Psr\Log\LogLevel::DEBUG ));
注入解析工作流程
要自定义解析器返回之前解析的类,只需监听 CLASS_RESOLVED
事件。
use Jonsa\PimpleResolver\ServiceProvider; use Jonsa\PimpleResolver\Events; use Symfony\Component\EventDispatcher\EventDispatcher; $dispatcher = new EventDispatcher; $container[ServiceProvider::EVENT_DISPATCHER] = function () use ($dispatcher) { return $dispatcher; }); $dispatcher->addListener(Events::CLASS_RESOLVED, function (ClassResolvedEvent $event) { $object = $event->getResolvedObject(); ... });
或者,可以将 EVENT_DISPATCHER
键填充为字符串,该字符串反过来从容器中返回一个事件调度器
$container[ServiceProvider::EVENT_DISPATCHER] = 'my dispatcher key';
配置
ServiceProvider 有三个配置参数。
class ServiceProvider implements ServiceProviderInterface { public function __construct($bindContainerInstance = true, $makeMethod = 'make', $bindMethod = 'bind') { ... } }
$bindContainerInstance
告诉 ServiceProvider 是否将容器实例绑定到 'Pimple\Container'
键。如果容器被扩展,该类名也将绑定到容器实例。
$makeMethod
用于定义容器上用作 make 方法的键。
$bindMethod
用于定义容器上用作 bind 方法的键。