Twig как визуализировать шаблон веточки как переменную

Я пытаюсь отобразить шаблон веточки как переменную, используя symfony. У меня есть контроллер sendAction, который использует API mailgun для отправки писем в один или несколько списков рассылки. Вот мой код для контроллера:

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 довольно расплывчата.

Вы хотите визуализировать шаблон newsletter.twig.html внутри шаблона webapp/newsletter/send.html.twig?

Cid 10.08.2018 12:02

Вы должны просто сделать что-то вроде, например, $mailgunManager->sendMail($list->getAddress(), $newsletter->getSubject(), 'test', $this->render($newsletter->getTemplate()));

DarkBee 10.08.2018 12:02

Добро пожаловать в переполнение стека, если ответ вам поможет, вы можете отметить его как правильный, щелкнув галочку слева от ответа.

Sujit Agarwal 10.08.2018 12:09

@DarkBee: Почему вы продолжаете удалять теги php и twig? Вам не кажется, что вопрос связан с PHP или Twig?

lxg 10.08.2018 16:18

@lxg Не думаю, что нет. Здесь нет буквы twig, и это не проблема php сама по себе.

DarkBee 10.08.2018 16:22

Но речь идет о рендеринге шаблона Twig и доступе к механизму рендеринга. И, конечно же, это вопрос PHP. Посмотрите практически на все вопросы, связанные с языком, почти все они связаны с конкретной технологией, реализованной на данном языке. Я думаю, вы немного переусердствовали с редактированием тегов. Кстати, (простые) изменения тегов не добавляются к вашему счету редактирования, поэтому они не помогут вам получить оставшиеся 3 балла для значка «Редактор копий». ;)

lxg 10.08.2018 16:26

@Lxg Я здесь не значок .. Чего это стоит (а потом я заткнулся) OP даже мог бы попытаться отрендерить шаблон smarty. Я просто стараюсь использовать минимальное количество тегов и использовать их наилучшим образом. Я имею в виду, что кто-то может щелкнуть тег twig для этого вопроса и не сможет его решить, потому что он фокусируется на том, как передать / получить доступ к экземпляру службы внутри контроллера.

DarkBee 10.08.2018 17:05

Может быть, но это верно для многих вопросов, и я не думаю, что слишком многих людей это беспокоит. Кстати, вы можете начать исправлять теги в своих вопросах, например почему вопрос stackoverflow.com/questions/49231031/… содержит тег linux? Кроме того, почему бы вам не использовать freedts в своих вопросах, касающихся библиотеки FreeDTS? Другой пост содержит тег php, но также не является «проблемой php сам по себе». Вы непоследовательны.

lxg 10.08.2018 17:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
8
1 340
2

Ответы 2

Вы можете использовать getContent(), привязанный к вашей функции рендеринга.

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

Итак, вы создаете объект Symfony\Component\HttpFoundation\Response только для того, чтобы получить визуализированный контент? Хороший хак. ;)

lxg 10.08.2018 12:06

Нет, не знал. Метод getContent() находится на объекте Response, возвращаемом $this->render(). Вы фактически возвращаете тело ответа.

lxg 10.08.2018 12:10

Ага, изначально не заметил, моя беда :)

Sujit Agarwal 10.08.2018 12:11

Просто вставьте экземпляр 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.

Дело также в том, что тема и тело текста должны быть вставлены в шаблон, так как у меня есть заполнители для этих переменных в шаблоне.

TheKid 10.08.2018 13:15

По сути, я не хочу, чтобы подписчик получал электронное письмо только как HTML-контент, а получал его как шаблон со всеми другими переменными, введенными в шаблон.

TheKid 10.08.2018 13:25

Вы можете просто передать дополнительные значения в массив, который является вторым параметром метода render. Они будут доступны как переменные Twig по имени ключа массива.

lxg 10.08.2018 13:57

Другие вопросы по теме