thecodingmachine / yaml-definition-loader

提供了一种可以将 YAML 文件转换为与 definition-interop 标准兼容的容器定义的加载器。

0.1.0 2015-11-30 14:05 UTC

This package is auto-updated.

Last update: 2024-09-06 23:31:59 UTC


README

Scrutinizer Code Quality Build Status Coverage Status

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
    • 共享服务
    • 合成服务
    • 懒加载服务
    • 抽象服务
    • 基于文件的服务
    • 已弃用服务
    • 装饰服务
    • 自动装配服务