【问题标题】:twig how to render a twig template as a variable树枝如何将树枝模板呈现为变量
【发布时间】:2018-08-10 09:56:40
【问题描述】:

我正在尝试使用 symfony 将 twig 模板渲染为变量。我有一个“sendAction”控制器,它使用 mailgun API 将电子邮件发送到一个或多个邮件列表。这是我的控制器代码:

public function sendAction(Request $request, Newsletter $newsletter, MailgunManager $mailgunManager) {
  $form = $this->createForm(SendForm::class);
  $form->handleRequest($request);

  $formData = array();

  if ($form->isSubmitted() && $form->isValid()) {

        $formData = $form->getData();

        $mailingLists = $formData['mailingLists'];

        foreach ($mailingLists as $list) {

            $mailgunManager->sendMail($list->getAddress(), $newsletter->getSubject(), 'test', $newsletter->getHtmlContent());

            return $this->render('webapp/newsletter/sent.html.twig');
        }
    }
    return $this->render('webapp/newsletter/send.html.twig', array(
        'newsletter' => $newsletter,
        'form' => $form->createView()
    ));
  }
}

这是我的 sendMail (mailgun) 函数:

  public function sendMail($mailingList, $subject, $textBody, $htmlBody) {

   $mgClient = new Mailgun($this::APIKEY);

   # Make the call to the client.
         $mgClient->sendMessage($this::DOMAIN, array(
            'from'      => $this::SENDER,
            'to'        => $mailingList,
            'subject'   => $subject,
            'text'      => $textBody,
            'html'      => $htmlBody
        ));
  }

我希望我的“$newsletter->getHtmlContent()”呈现名为“newsletter.twig.html”的模板。任何人都可以帮助我或指出我可以做什么或在哪里可以找到关于我正在尝试做什么的教程或注释的正确方向。 symfony 的文档很模糊。

【问题讨论】:

  • 你想在模板webapp/newsletter/send.html.twig内渲染模板newsletter.twig.html
  • 你应该做类似的事情,例如$mailgunManager->sendMail($list->getAddress(), $newsletter->getSubject(), 'test', $this->render($newsletter->getTemplate()));
  • 欢迎堆栈溢出,如果答案对您有帮助,您可以通过单击答案左侧的勾号将其标记为正确。
  • @DarkBee:你为什么一直删除phptwig 标签?你不觉得这个问题和 PHP 或者 Twig 有关吗?
  • @lxg 我不这么认为。这里没有twig 的字母,它本身也不是php 的问题。

标签: symfony


【解决方案1】:

您可以使用链接到您的渲染函数的getContent()

return $this->render('webapp/newsletter/send.html.twig', array(
        'newsletter' => $newsletter,
        'form' => $form->createView()
    ))->getContent();

【讨论】:

  • 所以你创建了一个Symfony\Component\HttpFoundation\Response 对象,只是为了获取渲染的内容?不错的黑客。 ;)
  • 不,我没有。 getContent() 方法位于 $this->render() 返回的 Response 对象上。您实际上是在返回响应正文。
  • 是的,一开始没注意到,我的错 :)
【解决方案2】:

只需将Symfony\Bundle\FrameworkBundle\Templating\EngineInterface 的实例注入到您的操作中,您就可以直接使用 Twig:

public function sendAction(Request $request, EngineInterface $tplEngine, Newsletter $newsletter, MailgunManager $mailgunManager)
{
    // ... other code
    $html = $tplEngine->render('webapp/newsletter/send.html.twig', [
        'newsletter' => $newsletter,
        'form' => $form->createView()
    ]);
}

请注意,$this->render()(在控制器操作中)将返回一个 Symfony\Component\HttpFoundation\Response 的实例,而 $tplEngine->render() 返回一个 HTML 字符串。

【讨论】:

  • 这件事还需要将主题和文本主体注入模板,因为我在模板中为这些变量提供了占位符。
  • 基本上,我不会让订阅者仅将电子邮件作为 html 内容接收,而是将其作为模板接收,并将所有其他变量都注入到模板中。
  • 您可以简单地将附加值传递到数组中,该数组是render 方法的第二个参数。它们将通过数组键的名称作为 Twig 变量提供。
猜你喜欢
  • 2013-08-07
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 2013-05-11
  • 2016-05-11
  • 1970-01-01
相关资源
最近更新 更多