caridea/container

一个依赖注入库的小虾米

3.0.1 2018-01-06 17:29 UTC

README

Caridea是一个小巧的PHP应用程序库。当你只需要一些辅助而无需完整框架时,这个小家伙就是你的选择。

这是一个符合PSR-11规范的依赖注入容器。

Packagist Build Status Scrutinizer Code Quality Code Coverage

安装

您可以使用Composer安装此库

$ composer require caridea/container
  • 此项目的master分支(版本3.x)需要PHP 7.1,并依赖于caridea/event
  • 此项目的2.x版本需要PHP 7.0,并依赖于caridea/event
  • 此项目的1.x版本需要PHP 5.5,并依赖于caridea/event

兼容性

此库的发布将遵循语义化版本控制

我们的代码旨在遵守PSR-1PSR-2PSR-4规范。如果您发现任何与规范兼容性问题,请发送拉取请求!

概述

  • 《Caridea\Container\Properties》类旨在为可能用作其他组件设置的标量配置值。
  • 《Caridea\Container\Objects》类允许使用急切、延迟和原型对象。
    • 它还实现了《Caridea\Event\Publisher》,并将事件广播到任何实现《Caridea\Event\Listener》的受管理对象。
  • 《Caridea\Container\EmptyContainer》类是一个空的、无操作的容器。

您可以通过名称和类型检索包含的对象!

文档

示例

仅提供几个快速示例。

配置和依赖

$config = [
    'db.uri' => 'mongodb://127.0.0.1:27017',
    'mail.host' => '192.168.1.100'
];
$properties = new \Caridea\Container\Properties($config);
$objects = \Caridea\Container\Objects::builder()
    ->eager('mongoClient', 'MongoClient', function($c){
        return new \MongoClient($c->get('db.uri'));
    })
    ->lazy('mailService', 'My\Mail\Service', function($c){
        return new \My\Mail\Service($c->('mail.host'));
    })
    ->lazy('userService', 'My\User\Service', function($c){
        return new \My\User\Service($c->get('mongoClient'), $c->get('objectStorage'));
    })
    ->proto('objectStorage', 'SplObjectStorage', function($c){
        return new \SplObjectStorage();
    })
    ->build($properties);

$userService = $objects->get('userService');

父级代理

您可以将对象容器嵌套。例如,您可以使用一个包含服务对象的容器和一个包含Web控制器的子容器。

$services = \Caridea\Container\Objects::builder()
    ->eager('blogService', 'My\Blog\Service', function($c){
        return new \My\Blog\Service();
    })
    ->build();
$controllers = \Caridea\Container\Objects::builder()
    ->eager('blogController', 'My\Blog\Controller', function($c){
        return new \My\Blog\Controller($c->get('blogService'));
    })
    ->build($services);

$controllers = $controllers->getByType('My\Blog\Controller'); // ['blogController' => BlogController]

事件

$objects = \Caridea\Container\Objects::builder()
    ->eager('eventListener', 'My\Cool\EventListener', function($c){
        // we are assuming that this class implements Caridea\Event\Listener
        return new \My\Cool\EventListener();
    })
    ->build();

// assuming that CustomEvent implements Caridea\Event\Event
$objects->publish(new CustomEvent());
// Here, the eventListener object will have its ->notify() method invoked with the CustomEvent

从《Objects》容器返回的任何实现《\Caridea\Event\PublisherAware》的对象将通过《setPublisher》方法接收到容器。

容器感知

从《Objects》容器返回的任何实现《\Caridea\Container\ContainerAware》的对象将通过《setContainer》方法接收到容器。我们提供了一个特质来简化这个过程。

class MyContainerAware implements \Caridea\Container\ContainerAware
{
    use \Caridea\Container\ContainerSetter;

    public function __construct()
    {
        $this->container = new \Caridea\Container\EmptyContainer();
    }
}