poirot / ioc
此包已被弃用且不再维护。未建议替代包。
关于此包最新版本(dev-master)的许可信息不可用。
服务管理器和IoC容器。
dev-master
2017-05-10 10:35 UTC
Requires
- poirot/loader: dev-master
- poirot/std: dev-master
This package is auto-updated.
Last update: 2020-06-01 19:50:26 UTC
README
现代。快速。极简。服务管理容器。
概述使用示例
class defaultService extends AbstractService { /** * Create Service * * @return mixed */ function createService() { return new Directory(); } } $container = new Container('main'); $container->set(new FactoryService(['name' => 'sysdir', 'delegate' => function() { // Delegates will bind to service object as closure method /** @var FactoryService $this */ $sc = $this->getServiceContainer(); return $sc->from('files')->get('folder'); }, 'allow_override' => false] )); $nest = new Container('main'); $nest->set(new defaultService(['name' => 'directory', 'allow_override' => true])); $nest->setAlias('dir', 'directory'); $nest->setAlias('folder', 'dir'); $nest->setAlias('boom', 'boomService'); $container->nest($nest, 'files'); $dir = $container->get('sysdir') ->scanDir();
或从构建器
$container = new Container(new ContainerBuilder([ 'namespace' => 'main', 'services' => [ 'FactoryService' => [ // Prefixed with Container namespace 'name' => 'sysdir', 'delegate' => function() { // Delegates will bind to service object as closure method /** @var FactoryService $this */ $sc = $this->getServiceContainer(); return $sc->from('files')->get('folder'); }, 'allow_override' => false ], ], 'nested' => [ [ 'namespace' => 'files', 'services' => [ new defaultService(['name' => 'directory' , 'allow_override' => true ]) ], 'aliases' => [ 'dir' => 'directory', 'folder' => 'dir', ], ], ], ])); $dir = $container->get('sysdir') ->scanDir();
嵌套层次结构
$container = new Container(new ContainerBuilder([ 'namespace' => 'main', 'services' => [ 'FactoryService' => [ // Prefixed with Container namespace 'name' => 'sysdir', 'delegate' => function() { // Delegates will bind to service object as closure method /** @var FactoryService $this */ $sc = $this->getServiceContainer(); return $sc->from('/filesystem/system')->get('folder'); // <<<<<=====---- }, 'allow_override' => false ], ], 'nested' => [ [ 'namespace' => 'filesystem', 'nested' => [ // <<<<<=====---- 'system' => [ 'services' => [ new defaultService(['name' => 'directory' , 'allow_override' => true ]) ], 'aliases' => [ 'dir' => 'directory', 'folder' => 'dir', ], ], ], ], ], ]));
以别名共享服务
$container = new Container(new ContainerBuilder([ 'namespace' => 'main', 'aliases' => [ 'sysdir' => ['/filesystem/system', 'folder'], // <<<====---- Shared Alias ], 'nested' => [ [ 'namespace' => 'filesystem', 'nested' => [ 'system' => [ 'services' => [ new defaultService(['name' => 'directory' // <<<===--- share this , 'allow_override' => true ]) ], 'aliases' => [ 'dir' => 'directory', 'folder' => 'dir', // <<<===--- consumed here ], ], ], ], ], ])); /** @var Directory $dir */ $dir = $container->get('sysdir') ->scanDir();
使用服务选项调用服务
我们可以使用一些选项构建任何容器服务,这些选项必须在iCService类接口中实现。使用示例在FunctorService中。
$container->set(new FunctorService([ 'name' => 'service_name', 'callable' => function($arg1, $arg2) { # callable function will bind to service object as closure method # so you can access methods from FunctorService $sc = $this->getServiceContainer(); # here we return service result return $arg1.' '.$arg2; }, 'allow_override' => false ])); $container->fresh('service_name', [$arg1Val, $arg2Val]);
理解刷新服务检索
$services->set(new FunctorService('dynamicUri', function($arg = null) { return sprintf( '%s Service Requested. <br/>' , date('H:i:s'), $arg ); })); echo $services->get('dynamicUri'); sleep(2); echo $services->get('dynamicUri'); sleep(2); echo $services->fresh('dynamicUri'); sleep(2); echo $services->get('dynamicUri'); sleep(2); echo $services->get('dynamicUri', ['arg' => 'this is new request because options changed.']);
结果
12:19:49 Service Requested.
12:19:49 Service Requested.
12:19:53 Service Requested. // fresh request
12:19:49 Service Requested.
12:19:57 Service Requested. // with new options consume as fresh