issei-m / sf-dependency-injection-plugin
支持Symfony的DependencyInjection组件,用于您的symfony1项目
Requires
- composer/installers: ~1.0.0
- symfony/config: ~2.7
- symfony/dependency-injection: ~2.7
Requires (Dev)
- lexpress/symfony1: ~1.5.0
- phpunit/phpunit: ~4.4
- symfony/expression-language: ~2.7
- symfony/http-kernel: ~2.7
Suggests
- symfony/http-foundation: Allows you to strip the comments in compiled container code.
This package is auto-updated.
Last update: 2024-09-05 08:51:03 UTC
README
提供将Symfony2的DependencyInjection组件与旧版symfony (1.4+)项目集成的功能。
安装
使用Composer是最理想的方式
$ composer require issei-m/sf-dependency-injection-plugin
在这里,Composer会在您的plugins
目录中安装此插件,以及插件所依赖的一些其他库到vendor
目录。
如果您不使用Composer,您需要手动安装此插件和一些其他库。
使用方法
首先,在%SF_ROOT%/config/services.yml
中创建您的services.yml
。它可以为不同的环境定义参数/服务。
例如:
# config/services.yml dev: parameters: mailer.transport: gmail all: parameters: # ... mailer.transport: sendmail services: mailer: class: Mailer arguments: ["%mailer.transport%"] newsletter_manager: class: NewsletterManager calls: - [setMailer, ["@mailer"]]
services.yml
支持配置级联,类似于settings.yml
,并且它可以位于不同的config
目录中,例如应用程序的(例如apps/frontend/config
)。当服务容器编译时,这些值将被合并。
接下来,在您的ProjectConfiguration
中启用此插件
class ProjectConfiguration extends sfProjectConfiguration { public function setup() { $this->enablePlugins('sfDependencyInjectionPlugin'); ... } }
现在,您的sfContext
已安装Symfony的服务容器,您可以在代码中如下使用它
// Get the ServiceContainer. $container = sfContext::getInstance()->getContainer(); // Retrieve the NewsletterManager class which was initialized with the Mailer. $newsletterManager = $container->get('newsletter_manager');
如果您使用lexpress/symfony1,则sfServiceContainer
将被插件的服务容器替换。但它可能几乎与框架的容器一样好
$container = sfContext::getInstance()->getServiceContainer(); $newsletterManager = sfContext::getInstance()->getService('newsletter_manager');
在任务中
即使您没有在任务中初始化sfContext,您也可以手动初始化服务容器,如下所示
$containerClass = require $this->configuration->getConfigCache()->checkConfig('config/services.yml', true); $container = new $containerClass();
事件
当容器编译时,会触发service_container.build
事件。如果您订阅此事件,可以扩展容器定义。
这意味着您可以使用自己的扩展、编译器通过等...来控制服务容器,就像您所希望的那样。
class ProjectConfiguration extends sfProjectConfiguration { public function setup() { $this->dispatcher->connect('service_container.build', function (sfEvent $event) { /** @var \Symfony\Component\DependencyInjection\ContainerBuilder $container */ $container = $event->getSubject(); $container->addObjectResource($this); // additional parameter $container->setParameter('foo', 'bar'); // add extension $container->registerExtension(new YourExtension()); // add compiler pass $container->addCompilerPass(new YourPass()); }); } }