jonsa/pimple-ioc

从 Pimple 容器中解析类

v1.3.0 2015-10-07 20:54 UTC

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 方法的键。