mooti / container
简单的服务容器
0.0.1
2016-08-31 22:55 UTC
Requires
- php: >=5.5.9
- container-interop/container-interop: ^1.1
- mooti/factory: ^1.0
Requires (Dev)
- phpunit/phpunit: 5.1.*
- satooshi/php-coveralls: dev-master
This package is not auto-updated.
Last update: 2024-09-14 19:47:34 UTC
README
使用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();