thecodingmachine / yaml-definition-loader
提供了一种可以将 YAML 文件转换为与 definition-interop 标准兼容的容器定义的加载器。
Requires
- container-interop/definition-discovery: dev-master
- container-interop/definition-interop: ~0.1.0
- symfony/yaml: ~2.0 | ~3.0
Requires (Dev)
- mnapoli/assembly: ~0.1.0
- phpunit/phpunit: ~4.5
- satooshi/php-coveralls: dev-master
README
为 definition-interop 的 YAML 定义加载器
此包包含一个 加载器,可以将 YAML 文件转换为与 definition-interop 标准兼容的容器定义。
为了使新手更容易理解,支持的 YAML 文件是 Symfony 服务 YML 文件格式的一个子集。
安装
您可以通过 Composer 安装此包
{ "require": { "thecodingmachine/yaml-definition-loader": "~1.0" } }
该包遵循 SemVer 规范,并且不同小版本之间将保持完全向后兼容。
自动发现
如果您想使您的包中的 YAML 文件能够自动被发现(使用 Puli),您应该将您的 YAML 文件绑定到 "definition-interop/yaml-definition-files" 绑定类型。
假设您的服务文件位于 "services/my_service.yml"。
在您的包中,只需输入
# This maps the virtual Puli path "/my_vendor/my_package" to the "services" directory. puli map /my_vendor/my_package services # Binds all YML files in the directory services/*.yml (please note how the directory is a virtual Puli directory). puli bind /my_vendor/my_package/*.yml definition-interop/yaml-definition-files
如果消费者使用 Puli 进行发现,则绑定的 YML 文件可以自动发现。
用法
此包包含一个 YamlDefinitionLoader
类。该类的目的是从一个 YAML 文件生成多个 "入口定义"(如 definition-interop 中定义)。
然后,可以使用适当的工具(如 Yaco)将这些定义转换为依赖注入容器。
use TheCodingMachine\Definition\YamlDefinitionLoader; $servicesProvider = new YamlDefinitionLoader("my-services.yml"); $definitions = $servicesProvider->getDefinitions();
注意:YamlDefinitionLoader
实现了 Interop\Container\Definition\DefinitionProviderInterface
。
文件格式
声明参数
parameters: foo: bar
声明一个实例
services: my_service: class: My\ClassName arguments: [ foo, bar ]
这将声明一个名为 "my_service" 的服务,来自类 My\ClassName
,并将字符串 "foo" 和 "bar" 传递给构造函数。
引用一个实例
services: my_reference: class: My\ReferencedClass my_service: class: My\ClassName arguments: [ "@my_reference" ]
将 my_reference
服务传递给 my_service
服务的构造函数作为参数。要引用一个服务,请使用 @
前缀。如果您想要以 @
开头的字符串,请将其重复一次。例如
@service
@@以@开头的文本
调用服务的方法
services: my_service: class: My\ClassName calls: - [ setLogger, [ '@logger' ] ]
在生成服务之后,您可以调用服务的方法。例如,您可以调用设置器。您需要创建一个 calls
属性,并将要调用的方法列表传递给它。第一个项目是方法名称,第二个项目是传递给该方法的参数列表。
设置服务的公共属性
services: my_service: class: My\ClassName properties: foo: bar bar: "@baz"
使用 properties
键在服务中设置公共属性。
别名
services: my_service: class: My\ClassName my_alias: alias: my_service
您可以使用 alias
属性来构建服务的别名。
或者,您也可以使用这种语法
services: my_alias: "@my_service"
工厂
您可以使用其他服务或类的工厂方法来构建您的服务。
静态工厂
services: my_service: factory: My\ClassName::myMethod
将 my_service
实例从对 My\ClassName::myMethod
的调用中返回。您甚至可以使用 arguments
属性传递参数到这个方法。
services: my_service: factory: My\ClassName::myMethod attributes: [ '@logger', 42 ]
您还可以使用这种替代语法
services: my_service: factory: [ 'My\ClassName', 'myMethod' ]
基于服务的工厂
services: factory: class: My\Factory my_service: factory: factory:myMethod
将 my_service
实例从名为 factory
的服务的 myMethod
调用中返回。注意我们如何使用单个 ':' 而不是双冒号 '::'。
您还可以使用这种替代语法
services: factory: class: My\Factory my_service: factory: 'My\ClassName@myMethod'
与 Symfony YAML 服务格式相比的明显差异
- 键是大小写敏感的
- 参数不接受引用("parameters" 部分中不允许有 "@service" 引用)。它们只能是标量。
- 以下功能不支持
- tags
- public/private services
- 共享服务
- 合成服务
- 懒加载服务
- 抽象服务
- 基于文件的服务
- 已弃用服务
- 装饰服务
- 自动装配服务