Класс TemplatedEmail
Класс TemplatedEmail расширяет класс Email
и позволяет формировать тело письма на основе
Twig-шаблонов. Вместо того чтобы вручную собирать
HTML-строку, вы указываете имя шаблона и передаёте
данные через контекст. Первым параметром метода
htmlTemplate передаётся имя HTML-шаблона,
метода textTemplate - имя текстового шаблона,
а метод context принимает массив переменных
для подстановки.
Синтаксис
<?php
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
$email = (new TemplatedEmail())
->from('sender@example.com')
->to('recipient@example.com')
->subject('Тема письма')
->htmlTemplate('email/index.html.twig')
->textTemplate('email/index.txt.twig')
->context(['key' => 'value']);
?>
Пример
Давайте создадим письмо на основе HTML-шаблона
и отправим его через MailerInterface:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/send', name: 'article_send')]
public function send(MailerInterface $mailer): Response
{
$email = (new TemplatedEmail())
->from(new Address('sender@example.com', 'Sender'))
->to(new Address('recipient@example.com', 'Recipient'))
->subject('Welcome')
->htmlTemplate('email/welcome.html.twig')
->context([
'name' => 'user',
'text' => 'abcde',
]);
$mailer->send($email);
return new Response('sent');
}
}
?>
Шаблон письма может выглядеть так:
<p>Hello, {{ name }}!</p>
<p>{{ text }}</p>
Результат выполнения кода:
"sent"
Пример
Давайте передадим в контекст несколько переменных разных типов и используем их в шаблоне:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/send-list', name: 'article_send_list')]
public function sendList(MailerInterface $mailer): Response
{
$email = (new TemplatedEmail())
->from(new Address('sender@example.com', 'Sender'))
->to(new Address('recipient@example.com', 'Recipient'))
->subject('List')
->htmlTemplate('email/list.html.twig')
->context([
'items' => ['a', 'b', 'c', 'd', 'e'],
'count' => 5,
'enabled' => true,
]);
$mailer->send($email);
return new Response('list sent');
}
}
?>
Шаблон с циклом и условием:
<p>Count: {{ count }}</p>
{% if enabled %}
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% endif %}
Результат выполнения кода:
"list sent"
Смотрите также
-
класс
Email,
который создаёт обычное письмо без шаблона -
метод
htmlTemplate,
который задаёт HTML-шаблон письма -
метод
textTemplate,
который задаёт текстовый шаблон письма -
метод
context,
который передаёт переменные в шаблон