在Symfony 3.3中,我们添加了一个功能,以简化服务配置。这会令你的程序更易维护,同时提高开发效率。
服务配置的快捷语法
Contributed by
Maxime Steinhausser
in #21313.
在Symfony 3.3中,对于未命名的服务 类的参数是可选的。当服务是通过YAML格式定义时,我们决定进一步优化常规用法,即当服务仅包含 class
和
arguments
选项时:
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%'] |
默认的服务配置
Contributed by
Nicolas Grekas and
Maxime Steinhausser
in #21071.
对于即将到来的Symfony 4.0,一个动议是,服务默认私有。我们放弃了这一想法,因为从Symfony 3.x的程序升级过来时会有短板。然而,我们决定添加一个功能,用于 简化默认服务定义的配置。
全新的 services._defaults
选项允许你为单一文件内定义的所有服务,设置 public
, tags
和 autowire
选项的值:
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} |