axis / axis-service-container-plugin
symfony 1.x 插件,使用 Pimple 和高级配置功能改进 factories.yml 配置处理器
Requires
- php: >=5.3.0
- composer/installers: *
- pimple/pimple: 1.*
This package is not auto-updated.
Last update: 2020-08-21 17:56:35 UTC
README
此插件允许使用 Pimple 作为服务容器将任何数量的工厂配置添加到 symfony factories.yml。
它还增加了实例化和配置工厂的丰富功能。
安装
Composer 方式
- 将
axis/axis-service-container-plugin
依赖项添加到您的composer.json
"require": { "axis/axis-service-container-plugin": "dev-master" }
- 在您的
ProjectConfiguration.class.php
中启用AxisServiceContainerPlugin
插件。 - 如果尚未包含,请包含由 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 - 首次稳定发布