如何操作第三方Bundle提供的服务

3.4 版本
维护中的版本

由于Symfony和所有第三方bundles在配置和取出相应的服务时都是通过容器来进行,因此你可以很容易的得到这些服务,甚至将它们用在你自己的服务中。为了令事情简单,Symfony默认并不强制要求把controller也定义为服务。而且,Symfony把整个容器注入到你的controller中。例如,当需要对用户的session信息进行存储操作时,Symfony提供了一个session 服务,在标准版中你可以像下面这样得到:

1
2
3
4
5
6
7
public function indexAction($bar)
{
    $session = $this->get('session');
    $session->set('foo', $bar);
 
    // ...
}

在Symfony中,你将始终用到Symfony核心以及第三方bundles提供的服务,来完成诸如渲染模板 (templating), 发送邮件(mailer), 或是得到请求中包含的信息(request)等等任务。

在你的程序中,你可以把上面这些服务使用到你已经创建的服务之中。就从修改NewsletterManager开始,我们已经可以使用真实的Symfony mailer服务 (替换掉虚构的app.mailer)。也可以把模板引擎服务传到NewsletterManager 中,这样它就能够基于模板来生成邮件内容了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// src/AppBundle/Newsletter/NewsletterManager.php
namespace AppBundle\Newsletter;
 
use Symfony\Component\Templating\EngineInterface;
 
class NewsletterManager
{
    protected $mailer;
 
    protected $templating;
 
    public function __construct(
        \Swift_Mailer $mailer,
        EngineInterface $templating
    ) {
        $this->mailer = $mailer;
        $this->templating = $templating;
    }
 
    // ...
}

配置服务容器是十分简单的:

1
2
3
4
5
# app/config/services.yml
services:
    app.newsletter_manager:
        class:     AppBundle\Newsletter\NewsletterManager
        arguments: ['@mailer', '@templating']
1
2
3
4
5
6
7
8
9
10
11
12
<!-- 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">
 
    <service id="app.newsletter_manager" class="AppBundle\Newsletter\NewsletterManager">
        <argument type="service" id="mailer"/>
        <argument type="service" id="templating"/>
    </service>
</container>
1
2
3
4
5
6
7
8
// app/config/services.php
$container->setDefinition('app.newsletter_manager', new Definition(
    'AppBundle\Newsletter\NewsletterManager',
    array(
        new Reference('mailer'),
        new Reference('templating'),
    )
));

newsletter_manager服务现在可以使用框架核心的mailertemplating服务了。这是通常会使用的方式,借助框架内各式服务之力,来创建适合你自己程序的服务。

请确保swiftmailer 入口出现在你的程序级配置信息中。 就像前面通过容器扩展来导入配置信息所提到的那样, swiftmailer关键字从SwiftmailerBundle中调取了服务扩展,该扩展被注册为名为mailer的服务。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)