kzykhys / bowl
PHP5.4的另一个依赖注入容器
v1.0.0
2013-11-19 10:09 UTC
Requires
- php: >=5.4
This package is not auto-updated.
Last update: 2024-09-24 00:57:29 UTC
README
- 管理多个环境(生产/开发/测试...)
- 管理对象之间的依赖
- 执行延迟实例化
- 执行工厂模式
- 无需外部文件配置依赖
- 你可以避免在类中使用Singleton/Factory模式
需求
- PHP5.4+
安装
创建或更新你的composer.json,并运行composer update
{ "require": { "kzykhys/bowl": "1.0" } }
使用方法
定义参数
$bowl = new \Bowl\Bowl(); $bowl['lang'] = 'en'; $bowl['debug'] = true;
定义共享服务
$bowl = new \Bowl\Bowl(); $bowl->share('service_name', function () { return new stdClass(); }); var_dump($bowl->get('service_name') === $bowl->get('service_name')); // bool(true)
定义工厂服务
$bowl = new \Bowl\Bowl(); $bowl->factory('service_name', function () { return new stdClass(); }); var_dump($bowl->get('service_name') === $bowl->get('service_name')); // bool(false)
定义依赖于其他服务的服务
$bowl = new \Bowl\Bowl(); $bowl->share('driver.mysql', function () { return new MysqlDriver(); }); $bowl->share('connection', function () { $c = new Connection(); $c->setDriver($this->get('driver.mysql')); return $c; });
使用标签管理服务集合
$bowl = new \Bowl\Bowl(); $bowl->share('form.type.text', function () { return new TextType(); }, ['form.type']); $bowl->share('form.type.email', function () { return new EmailType(); }, ['form.type']); $bowl->share('form', function () { $form = new Form(); foreach ($this->getTaggedServices('form.type') as $service) { $form->addType($service); } return $form; });
与环境标志一起工作
use Bowl\Bowl; $bowl = new Bowl(); // Common parameters $bowl['lang'] = 'en'; // Production configuration $bowl->configure('production', function (Bowl $bowl) { $bowl['debug'] = false; $bowl->share('orm.repository', function () { return new EntityRepository(); }); }); // Development configuration $bowl->configure('development', function (Bowl $bowl) { $bowl['debug'] = true; $bowl->share('orm.repository', function () { return new MockRepository(); }); }); // Common services $bowl->share('orm.manager', function () { return new OrmManager($this->get('orm.repository')); }); $bowl->share('fixture.loader', function () { return new Loader($this->get('orm.manager'), $this['debug']); }); // Set enviroment manually $bowl->env('production'); // Or using system's environment variable $bowl->env(getenv('APP_ENV') ? getenv('APP_ENV') : 'production');
真实案例
<?php require __DIR__ . '/../vendor/autoload.php'; $bowl = new \Bowl\Bowl(); // Set a parameter $bowl['debug'] = false; // Shared service $bowl->share('ciconia.renderer', function () { return new \Ciconia\Renderer\HtmlRenderer(); }); // Tagged service $bowl->share('ciconia.extension.table', function () { return new \Ciconia\Extension\Gfm\TableExtension(); }, ['ciconia.extension']); // This example shows how to manage services using tags $bowl->share('ciconia', function () { $ciconia = new \Ciconia\Ciconia(); // $bowl is bind to this closure, so you can access $this as Bowl. if ($this['debug']) { $ciconia = new \Ciconia\Diagnose\Ciconia(); } // Resolve dependencies $ciconia->setRenderer($this->get('ciconia.renderer')); // All services tagged as "ciconia.extension" foreach ($this->getTaggedServices('ciconia.extension') as $extension) { $ciconia->addExtension($extension); } return $ciconia; }); // Get the object $ciconia = $bowl->get('ciconia'); echo $ciconia->render('Markdown is *awesome*'); // Create a new instance even if this is a shared object $ciconia = $bowl->reset('ciconia')->get('ciconia'); echo $ciconia->render('Markdown is *awesome*');
API
管理环境
configure(string $environment, \Closure $closure)
你可以根据生产环境和开发环境等环境标志来配置Bowl。
$bowl = new \Bowl\Bowl(); $bowl->configure('prod', function (\Bowl\Bowl $bowl) { $bowl['debug'] = false; });
env(string $environment)
你必须调用env()
来应用其中一个环境。
$bowl = new \Bowl\Bowl(); $bowl->configure('prod', function (\Bowl\Bowl $bowl) { $bowl['debug'] = false; }); $bowl->env('prod');
服务容器
share(string $name, \Closure $closure, [array $tags])
注册共享服务
$bowl = new \Bowl\Bowl(); $bowl->share('logger', function () { return new Logger(); }); $bowl->get('logger')->log($message);
factory(string $name, \Closure $closure, [array $tags])
注册工厂服务
$bowl = new \Bowl\Bowl(); $bowl->share('date.now', function () { return new \DateTime('now'); }); $bowl->get('date.now')->format('r');
extend(string $name, \Closure $closure)
扩展服务定义
$bowl = new \Bowl\Bowl(); $bowl->share('logger', function () { return new Logger(); }); $bowl->extend('logger', function (LoggerInterface $logger) { $logger->setPath(__DIR__.'/../app/logs'); return $logger; }); $bowl->get('logger')->log($message);
get(string $name)
获取对象
$bowl = new \Bowl\Bowl(); $bowl['debug'] = true; $bowl->factory('filesystem', function () { return new Filesystem(); }); $bowl->share('logger', function () { if ($this['debug']) { return new ConsoleLogger(); } else { return new FilesystemLogger($this->get('filesystem')); } }); $logger = $bowl->get('logger');
getTaggedServices(string $name)
获取带有标签的服务
$bowl = new \Bowl\Bowl(); $bowl->share('transport.smtp', function () { return new SmtpTransport(); }, ['email.transport']); $bowl->share('transport.sendmail', function () { return new SendmailTransport(); }, ['email.transport']); $bowl->share('mailer', function () { $mailer = new Mailer(); foreach ($this->getTaggedServices('email.transport') as $service) { $mailer->addTransport($service); } return $mailer; }); $bowl->get('mailer')->send($mimeMessage);
reset(string $name)
重新实例化对象,即使该服务是共享对象。
这是一个不安全的操作
$bowl = new \Bowl\Bowl(); $bowl->share('registry', function () { return new Registry(); }); try { $bowl->get('registry')->getManager()->flush(); } catch (\Exception $e) { $bowl->reset('registry'); }
贡献
请随意分支并发送pull request。
许可证
MIT许可证
作者
Kazuyuki Hayashi (@kzykhys)