如何在Symfony 4服务中使用renderView和twig模板

时间:2018-06-04 02:29:51

标签: php symfony dependency-injection twig symfony4

我正在新的Symfony 4应用程序中创建一个电子邮件服务。

我尝试了一百万件但没有运气。我目前只能为S4找到关于这个主题的一些资源。任何帮助表示赞赏。

这就是我想要实现的目标。我知道我必须在我的电子邮件服务中使用不同的服务,但没有运气。

<?php

namespace App\Mailer;

class Emailer
{

    public function sendWelcome($email): \Swift_Mailer
    {
        $message = (new \Swift_Message('P****** - Welcome In!'))
            ->setFrom('no-reply@p****n.com')
            ->setTo($email)
            ->setBody(
                $this->renderView(
                // templates/emails/registration.html.twig
                    'emails/registration.html.twig',
                    array('name' => $user->getUsername())
                ),
                'text/html'
            )
            ->setCharset('utf-8');

        $mailer->send($message);

        return true;
    }
}

2 个答案:

答案 0 :(得分:6)

首先,您需要将您的模板服务注入您的类(构造函数注入),然后您可以使用它来呈现模板。

在代码中,您可以看到我们在构造函数中对其进行类型提示,因此Symfony Dependency注入知道我们需要什么。然后我们就使用它。与您的$mailer服务相同。

<?php

namespace App\Mailer;

use Symfony\Component\Templating\EngineInterface;

class Emailer
{

    /**
     * @var EngineInterface
     */
    private $templating;

    /**
     * TestTwig constructor.
     */
    public function __construct(EngineInterface $templating)
    {
        $this->templating = $templating;
    }

    public function sendWelcome($email): \Swift_Mailer
    {
        $message = (new \Swift_Message('P****** - Welcome In!'))
            ->setFrom('no-reply@p****n.com')
            ->setTo($email)
            ->setBody(
                $this->templating->render(
                // templates/emails/registration.html.twig
                    'emails/registration.html.twig',
                    array('name' => $user->getUsername())
                ),
                'text/html'
            )
            ->setCharset('utf-8');

        $mailer->send($message);

        return true;
    }
}

答案 1 :(得分:1)

@ miles-m use语句与注入不同。 use语句只是使用类名作为别名来访问类。依赖注入是一种将类彼此分离的模式,这有助于更好地进行测试和调试(您可以将注入的对象替换为模拟对象等)。

注入Swift_Mailer的一种方法是作为构造函数参数,即

class Emailer
{
    /** @var \Swift_Mailer $mailer */
    private $mailer;    

    public function __construct(
        EngineInterface $templating,
        \Swift_Mailer $mailer <== mailer will be injected here
    ) : \Swift_Mailer
    {
        //...
        $this->mailer->send($message);
    }
}

class CallingClass
{
    //...
    $emailer = new Emailer(
        //EngineInterface instance
        //\Swift_Mailer instance <== injecting 
    );
    $emailer->sendWelcome('email@example.com');
}

其他问题

  1.   

    $mailer->send($message)

    您的$ mailer实例在哪里定义?

  2.   

    public function sendWelcome($email): \Swift_Mailer

         

    return true;

    trueSwift_Mailer的有效实例吗?