Symfony程序中的服务在传统上使用YAML、XML或PHP配置文件来定义。一个典型而简单的YAML服务定义像下面这样:

1
2
3
4
5
# app/config/services.yml
services:
    app.mailer:
        class:     AppBundle\Mailer
        arguments: [sendmail]

XML格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- app/config/services.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services
        http://symfony.com/schema/dic/services/services-1.0.xsd">
 
    <services>
        <service id="app.mailer" class="AppBundle\Mailer">
            <argument>sendmail</argument>
        </service>
    </services>
</container>

在Symfony 3.3中,我们为 Dependency Injection组件 添加了新的功能,允许以不同方式来使用服务。因此在 Symfony 3.3中,服务的 class 参数成为了可选的。当它未被定义时,Symfony认为该服务的 id 就是其PHP类:

当使用这一新功能时,要从容器中取得服务需要传入完整的PHP命名空间:

1
2
3
4
5
6
7
8
9
10
11
services:
    # ...
    # traditional service definition / 传统服务定义
    app.manager.user:
        class: AppBundle\EventListener\UserManager
        tags:  ['kernel.event_subscriber']
 
    # new service definition allowed in Symfony 3.3
    # Symfony 3.3中允许的全新服务定义
    AppBundle\EventListener\UserManager:
        tags:  ['kernel.event_subscriber']
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use AppBundle\EventListener\UserManager;
 
// ...
public function editAction()
{
    // ...
 
    // before Symfony 3.3 / Symfony 3.3之前
    $this->get('app.manager.user')->save($user);
 
    // Symfony 3.3 / Symfony 3.3之后
    $this->get(UserManager::class)->save($user);
 
    // ...
}

传统的服务定义如同以往一样工作(甚至在decorating services时只能如此)。然而,这个新功能连同其他可选功能比如“自动关联以及逐文件定义服务的默认选项”一起,将为需要的它们的项目和开发者开启RAD模式(rapid application development):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
services:
    # default options applied to all the services in this file
    # 默认选项作用于该文件中的所有服务
    _defaults:
        # enable autowiring for these services
        # 为这些服务开启自动关联
        autowire: true
        # make services private by default
        # 默认设置服务为私有
        public: false

    App\TwigExtension:
        tags: [twig.extension]

    App\Doc:
        tags:
            - { name: twig.runtime, id: "App\\TwigExtension" }