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" } |