axis/axis-service-container-plugin

该软件包已被废弃,不再维护。未建议替代软件包。

symfony 1.x 插件,使用 Pimple 和高级配置功能改进 factories.yml 配置处理器

1.1 2014-07-31 12:01 UTC

This package is not auto-updated.

Last update: 2020-08-21 17:56:35 UTC


README

此插件允许使用 Pimple 作为服务容器将任何数量的工厂配置添加到 symfony factories.yml。

它还增加了实例化和配置工厂的丰富功能。

安装

Composer 方式

  1. axis/axis-service-container-plugin 依赖项添加到您的 composer.json
  "require": {
    "axis/axis-service-container-plugin": "dev-master"
  }
  1. 在您的 ProjectConfiguration.class.php 中启用 AxisServiceContainerPlugin 插件。
  2. 如果尚未包含,请包含由 Composer 生成的 lib/vendor/autoload.php 文件。ProjectConfiguration.class.php
include __DIR__.'/../lib/vendor/autoload.php';

定义服务

基本定义

您可以为服务定义任何服务,就像标准的 symfony factories.yml 一样。假设您在 MyBasicServiceImplementation 类中实现了您的服务

class MyBasicServiceImplementation implements MyService
{
  public function doSomething()
  {
    echo 'Yep. It works!';
  }
}

并且您想使用 symfony 上下文工厂来定义它。因此,您只需要将其实例化配置添加到您的 factories.yml

  my_service:
    class: MyBasicServiceImplementation

现在您可以在您的代码中检索该类的实例

/** @var $myService MyService */
$myService = sfContext:getInstance()->get('my_service');
$myService->doSomething(); // echoes "Yep. It works!"

注意:所有服务都通过 Pimple 服务容器使用 share 方法存储。这意味着每个服务都是一个 共享对象,仅在实际首次请求时进行实例化。

带有参数的定义

假设您想实例化一个具有参数化构造函数的 MyParamServiceImplementation 类。

class MyParamServiceImplementation implements MyService
{
  protected $greating;

  public funciton __construct($greating = 'Yep. It works!')
  {
    $this->greating = $greating;
  }
  public function doSomething()
  {
    echo $this->greating;
  }
}

您可以使用 parameters 配置选项列出所有构造函数参数的顺序(任何顺序)但保留确切的名称

  my_service:
    class: MyParamServiceImplementation
    parameters:
      greating: "Hooray!"

用法相同

/** @var $myService MyService */
$myService = sfContext:getInstance()->get('my_service');
$myService->doSomething(); // echoes "Hooray!"

即时初始化

如果您的服务应在启动时实例化(从而初始化),则可以使用 initialization 配置参数。插件支持的唯一值是 instant。任何其他值都视为未定义且无意义。

  my_service:
    class: MyBasicServiceImplementation
    initialization: instant

通过定义 initialization: instant,您告诉 my_service 应在 symfony 上下文创建后立即实例化。

包含文件

如果您的服务类不是由 symfony 自动加载器或任何其他配置的自动加载器自动加载,则可以使用 file 配置选项告诉 symfony 在上下文创建时包含该文件。

  my_service:
    class: MyServiceImplementation
    file:  %SF_ROOT_DIR%/lib/vendor/my_company/MyServiceImplementation.php

标记

您可以使用标记来标记服务。这允许您检索所有具有特定标记分配的上下文中定义的服务。使用 tag 选项。

  my_service1:
    class: MySimpleService
    tag: greater

  my_service2:
    class: MyAdvancedService
    tag: greater

在此之后,您可以使用哈希前缀的标记名称检索所有服务

/** @var $services array */
$services = sfContext:getInstance()->get('#greater');
var_dump(array_map('get_class', $services)); 
// will output "array('MySimpleService', 'MyAdvancedService')"

服务参数

在定义服务时,有时需要定义构造函数参数的值。仅仅使用常量值可能不够。AxisServiceContainerPlugin 允许您使用高级参数处理。

配置值

如果您想使用作为参数传递的配置值来实例化服务,可以使用 config 参数处理器

  my_service:
    class: MyParamServiceImplementation
    parameters:
      greating: config://app_my_service_greating

这将实例化 my_service,将 sfConfig::get('app_my_service_greating') 的值作为 $greating 参数传递。

带默认值的配置值

您还可以为配置获取器使用默认值

  my_service:
    class: MyParamServiceImplementation
    parameters:
      greating: config://app_my_service_greating|Wow! It supports default value!

此代码将实例化 my_service,将 sfConfig::get('app_my_service_greating', "Wow! It supports default value!") 的值作为 $greating 参数传递。

已定义的服务

有时,将其他已定义的服务作为参数传递到您的服务构造函数中很方便。

  my_service_transport:
    class: SoapClient
    parameters:
      wsdl:  http://services.mycompany.com/?WSDL

  my_service:
    class: MyRemoteService
    parameters:
      transport: context://my_service_transport

现在从上下文服务容器中检索 my_service 将返回一个 my_service 服务实例,其中 my_service_transport 服务实例作为 $transport 参数传递给其构造函数。

具有特定标签的已定义服务

有时,您可能希望将具有特定标签分配的服务集合传递给服务构造函数。我们可以做到这一点!

  my_service.extension.a:
    class: MyServiceExtensionA
    tag: my_service.extension
  
  my_service.extension.b:
    class: MyServiceExtensionA
    tag: my_service.extension

  my_service: 
    class: MyService
    parameters:
      extensions: tag://my_service.extension

原始值

如果您想传递以特殊单词前缀的实际字符串值并保持其未处理状态,请使用 raw 前缀

  my_service:
    class: MyService
    parameters:
      greating: raw://config://This doesn't mean anything. It's just a string value

数组内的参数

您可以在作为参数值传递的数组中使用任何智能参数处理。例如,您可以这样做

  my_service:
    class: MyService
    parameters:
      options:
        transport: context://my_service_transport
        name: config://app_my_service_name|MyService

已声明服务

服务容器在非常开始时声明了服务。它们包括标准 symfony 工厂和核心上下文实体。

标准 symfony 服务

  • view_cache_manager
  • logger
  • i18n
  • controller
  • request
  • response
  • routing
  • storage
  • user
  • view_cache
  • mailer

所有这些服务都可以作为初始化参数使用 context:// 参数处理器。

附加插件服务

此外,插件还将以下服务追加到服务容器中

  • context - symfony 上下文实例
  • configuration - 当前应用程序配置
  • dispatcher - symfony 事件分发器
  • config_cache - symfony 配置缓存管理器。当您的服务依赖于 .yml 文件缓存时很有用
  • service_container - 服务容器实例本身(当通过 sfContext 实例无法使用服务容器的公共 API 时很有用)

已知问题

  • 您不能使用所有插件功能来配置 标准 symfony 服务。标准服务由默认的 symfony sfFactoryConfigHandler 处理。

新特性

1.1 - 在 sfFactoryConfigHandler 代码之前生成输出服务容器配置缓存代码。 - 将 config_cache 添加到预定义服务 1.0.0 - 首次稳定发布