Symfony 2:如何在控制器外部或服务中呈现模板?

6

如何在控制器之外或者服务中渲染模板?

我一直在遵循Symfony2的文档。文档链接

namespace Acme\HelloBundle\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;
    }

    // ...
}

这是我调用助手的地方:

$transport = \Swift_MailTransport::newInstance();
$mailer = \Swift_Mailer::newInstance($transport);
$helper = new MailHelper($mailer);
$helper->sendEmail($from, $to, $subject, $path_to_twig, $arr_to_twig);

首先,缺少的是在 construct 方法中的第二个参数:

$helper = new MailHelper($mailer);

“但是我该如何实例化EngineInterface呢?”
“当然不能这样写:”
new EngineInterface();

我完全迷失了。

我需要做的就是为发送的电子邮件渲染一个模板。


你还记得我在你最近的问题中分享的主要思路吗?都在这里了:https://gist.github.com/webdevilopers/4eea317ade72a119a72e - webDEVILopers
1个回答

24

只注入@twig并将渲染后的模板传递给邮件正文:

<?php

namespace Acme\Bundle\ContractBundle\Event;

use Acme\Bundle\ContractBundle\Event\ContractEvent;

class ContractListener
{
    protected $twig;
    protected $mailer;

    public function __construct(\Twig_Environment $twig, \Swift_Mailer $mailer)
    {
        $this->twig = $twig;
        $this->mailer = $mailer;
    }

    public function onContractCreated(ContractEvent $event)
    {
        $contract = $event->getContract();

        $body = $this->renderTemplate($contract);

        $projectManager = $contract->getProjectManager();

        $message = \Swift_Message::newInstance()
            ->setSubject('Contract ' . $contract->getId() . ' created')
            ->setFrom('noreply@example.com')
            ->setTo('dev@example.com')
            ->setBody($body)
        ;
        $this->mailer->send($message);
    }

    public function renderTemplate($contract)
    {
        return $this->twig->render(
            'AcmeContractBundle:Contract:mailer.html.twig',
            array(
                'contract' => $contract
            )
        );
    }
}

1
好的,让我再试一次。我尝试使用Twig_Environment,但我有一些问题需要重置加载器。我会再试一次并回复您。 - Brieuc
我猜是因为我试图将其用作服务而不是事件侦听器,所以我必须以那种方式调用服务(如果我使用\Twig_Environment)。$helper = new MailHelper($mailer,new \Twig_Environment); 它返回:您必须首先设置加载程序。这真的有必要吗? - Brieuc
1
我认为你误解了服务加载的方式。请查看Symfony文档。给你的服务命名,例如通过容器调用它。这样,邮件和Twig将自动注入到服务构造函数中。 - webDEVILopers
好的,现在清楚多了!非常感谢您的时间。我确实没有以正确的方式调用服务。$this->getConfigurationPool()->getContainer()->get('mail_helper'); 是正确的方式。 - Brieuc
我该如何从控制器中传递$twig? - KARTHEESWARAN
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接