Используйте лезвие в лезвии

В моей базе данных я сохраняю тексты, содержащие разметку лезвий, например:

Hello {!! $name !!} how are you today.

Я передаю этот текст в мой шаблон электронной почты в переменной $ text. В письме я использую {!! $ text !!} чтобы получить текст по почте. Однако, когда электронное письмо отправлено, оно показывает {!! знаки вместо переменной (которая также передается).
Как я могу сохранить разметку лезвия в моей базе данных и передать ее в мой код, где она должна заменить {!! что-то !!} с правильной переменной?

Моя почтовая функция.

$email = $order->email;
$name = $order->billingname;

//The text From the database.
$emailText = Email::findOrFail(5);
$mailtext = $emailText->text;

Mail::send('emails.tracktrace', ['text'=>$mailtext'email' => $email, 'name' => $name],
function ($m) use ($code, $email, $name) {
$m->from('[email protected]', 'domain');

$m->to($email, $name)->subject('Track your package!');
});

Обновить

У меня есть обходной путь, где я делаю:

$mailtext = str_replace('[name]', $name, $mailtext);

таким образом, пользователь может использовать [имя], я все еще хотел бы знать, как использовать его только с лезвием.

10

Решение

У вас не может быть блейд-строки для скомпилированного PHP-кода без его рендеринга в первую очередь. Вы должны попробовать свой собственный класс рендеринга или вызвать Blade.

public function send()
{
$emailText = Email::findOrFail(5);
$name = $order->billingname;
$mailtext = \Blade::compileString($emailText->text);
ob_start();
eval("?> $mailtext <?php");
$mailtext = ob_get_clean();
Mail::send('emails.tracktrace', [
'text' => $mailtext,
'email' => $email,
'name' => $name
],
function ($m) use ($code, $email, $name) {
$m->from('[email protected]', 'domain');
$m->to($email, $name)->subject('Track your package!');
});
}

Однако это не безопасно, так как есть eval, [Проверено в Laravel 5.1]

Также есть несколько хорошо написанных пакетов для этой конкретной цели, таких как StringBladeCompiler v3

6

Другие решения

Я использовал электронную почту, как показано ниже, все динамические переменные, которые должны быть заменены, похожи на ‘{{$ name}}’ в шаблоне электронной почты.

Я создал массив данных и использовал его непосредственно с почтовой библиотекой. Таким образом, вы можете заменить несколько динамических переменных в почтовом шаблоне на ходу.

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

Если ваш текст письма является динамическим и поступает из базы данных, вы можете использовать текст вместо шаблона письма в функции и передать массив переменных $ data, чтобы заменить их все за один раз.

$data = array('name' => $customer->Name, 'InvoiceID' => $dueinvoice["InvoiceNumber"],'AmountDue' => $dueinvoice["AmountDue"],'DueDate' => $duedate ,'CurrencyCode' => $dueinvoice["CurrencyCode"]);
\Mail::queue('emails.DueDateNotification',$data, function($message) use($customer)
{
$message->subject('DueDate Notification');
$message->to($customer->EmailAddress);
});

Другое дело, попробуйте использовать функцию «очередь» для почты, так как она уменьшает нагрузку и добавляет электронную почту в почтовую очередь laravel и отправляет ее по очереди.

Надеюсь, это поможет вам 🙂

0

По вопросам рекламы [email protected]