如何操作第三方Bundle提供的服务
由于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
服务现在可以使用框架核心的mailer
和templating
服务了。这是通常会使用的方式,借助框架内各式服务之力,来创建适合你自己程序的服务。
请确保swiftmailer 入口出现在你的程序级配置信息中。 就像前面通过容器扩展来导入配置信息所提到的那样, swiftmailer
关键字从SwiftmailerBundle中调取了服务扩展,该扩展被注册为名为mailer
的服务。