issei-m/sf-dependency-injection-plugin

支持Symfony的DependencyInjection组件,用于您的symfony1项目

安装次数: 10,234

依赖者: 0

建议者: 0

安全性: 0

星标: 7

关注者: 2

分支: 5

开放问题: 0

类型:symfony1-plugin

v1.3.1 2015-07-03 09:49 UTC

This package is auto-updated.

Last update: 2024-09-05 08:51:03 UTC


README

Build Status

提供将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());
    });
  }
}