mooti/container

简单的服务容器

0.0.1 2016-08-31 22:55 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:47:34 UTC


README

Build Status Coverage Status Latest Stable Version Total Downloads Latest Unstable Version License

使用PHP编写的简单服务容器

安装

您可以通过Packagist进行安装

$ composer require mooti/container

运行测试

如果您想运行测试,请使用以下命令

$ ./vendor/bin/phpunit

使用方法

创建容器并添加服务

use Mooti\Container\Container;

$container = new Container();

$container->set('logger', function () { return new Logger();});

//returns a new instance of Logger. Subsequent calls return the same object
$logger = $container->get('logger');

您还可以通过实现ServiceProviderInterface并实现其getServices方法来定义多个服务,以返回关联数组。如果元素是可调用的函数,则将调用该函数并返回结果。

use Mooti\Container\ContainerAware;

class ServiceProvider implements ServiceProviderInterface
{
    public function getServices()
    {
        return [
            'logger'  => function () { return new Logger();},
            'message' => 'Hello World'},
        ];
    }
}

要使用容器,您需要在您的类中使用ContainerAware特质。然后您可以使用get方法从容器中获取任何项目。

use Mooti\Container\ContainerAware;

class App
{
    use ContainerAware;

    public function run()
    {
    	$config  = $this->get('config');
    	$message = $this->get('message');

    	$logger->alert($message);
    }
}

因此,将所有这些放在一起,您将得到类似以下内容:

use Mooti\Container\Container;
use Mooti\Container\ContainerAware;
use Mooti\Container\ServiceProvider\ServiceProviderInterface;

class App
{
    use ContainerAware;

    public function run()
    {
    	$config  = $this->get('config');
    	$message = $this->get('message');

    	$logger->alert($message);
    }
}

class ServiceProvider implements ServiceProviderInterface
{
    public function getServices()
    {
        return [
            'logger'  => function () { return new Logger();},
            'message' => 'Hello World'},
        ];
    }
}

$container       = new Container();
$serviceProvider = new ServiceProvider::class;
$app             = new App();

$container->registerServices($serviceProvider);
$app->setContainer($container);

// Should log "Hello World"
$app->run();

ContainerAware特质扩展了mooti/factory的功能。您可以使用createNew方法创建对象,如果对象使用ContainerAware特质,它将尝试将容器注入到对象中。

use Mooti\Container\Container;
use Mooti\Container\ContainerAware;
use Mooti\Container\ServiceProvider\ServiceProviderInterface;

class FooBar
{
    use ContainerAware;

    private $foo;
    private $bar;

    public function __construct($foo, $bar)
    {
        $this->foo = $foo;
        $this->bar = $bar;
    }

    public function logMessage()
    {
        $config  = $this->get('config');
        $message = $this->get('message');

        $logger->alert($this->foo . ' ' .  $this->bar . ' ' . $message);
    }
}

class App
{
    use ContainerAware;

    public function run()
    {
        $fooBar = $this->createNew(FooBar::class, ['test 1', 'test 2']);
        $fooBar->logMessage();
    }
}

class ServiceProvider implements ServiceProviderInterface
{
    public function getServices()
    {
        return [
            'logger'  => function () { return new Logger();},
            'message' => 'Hello World'},
        ];
    }
}

$container       = new Container();
$serviceProvider = new ServiceProvider::class;
$app             = new App();

$container->registerServices($serviceProvider);
$app->setContainer($container);

// Should log "test 1 test 2 Hello World"
$app->run();