在Symfony 3.3中,我们添加了一个功能,以简化服务配置。这会令你的程序更易维护,同时提高开发效率。

服务配置的快捷语法

Contributed by
Maxime Steinhausser
in #21313.

在Symfony 3.3中,对于未命名的服务 类的参数是可选的。当服务是通过YAML格式定义时,我们决定进一步优化常规用法,即当服务仅包含 classarguments 选项时:

1
2
3
4
5
6
7
8
# Before / 之前
services:
    App\Foo\Bar:
        arguments: ['@baz', 'foo', '%qux%']
 
# After / 之后
services:
    App\Foo\Bar: ['@baz', 'foo', '%qux%']

默认的服务配置

对于即将到来的Symfony 4.0,一个动议是,服务默认私有。我们放弃了这一想法,因为从Symfony 3.x的程序升级过来时会有短板。然而,我们决定添加一个功能,用于 简化默认服务定义的配置

全新的 services._defaults 选项允许你为单一文件内定义的所有服务,设置 public, tagsautowire 选项的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
services:
    # these options are applied to all services defined in this file
    # 这些选项,适用于定义在这个文件内的所有服务
    _defaults:
        public: false
        autowire: true

    foo_bar:
        class: App\Foo\Bar

    foo:
        class: App\Foo
        # each service can override the default options set in the file
        # 每一个服务都可以覆写在本文件中设置好的默认值
        public: true

基于接口(Interface-based)的服务配置

Contributed by
Nicolas Grekas and Kévin Dunglas
in #21530.

既然添加了 _defaults 选项,我们决定扩展此项想法,通过使用一个全新的名为 _instanceof 的选项,来基于类的接口去设置默认值。例如,你可以通过这种方式来为每一个使用 Twig_ExtensionInterface 接口的服务,添加 twig.extension 标签:

1
2
3
4
5
# app/config/services.yml
services:
    _instanceof:
        Twig_ExtensionInterface:
            tags: ['twig.extension']

默认配置和基于接口配置的组合

如果你配合最近才添加的glob支持,同时使用default和interface-based进行配置,则你的程序级配置文件看上去会很精悍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# config/services.yml
services:
    _defaults:
        autowire: true
        public: false

    _instanceof:
        # Add the console.command tag to all services defined in this file having this type
        # 对本配置文件中的所有实现此接口的服务添加命令行标签
        Symfony\Component\Console\Command\Command:
            tags: ['console.command']
            public: true # needed because commands must be public 
                         # 必填项。因为命令必须公有

        Twig_ExtensionInterface:
            tags: ['twig.extension']

        Symfony\Component\EventDispatcher\EventSubscriberInterface:
            tags: ['kernel.event_subscriber']
 
    # Register all classes in these directories as services
    # 把这些目录下的所有类注册为服务 
    App\:
        resource: ../src/{Action,Command,EventSubscriber,Twig}