我需要在管理面板中编辑用于电子邮件的模板。任何想法?
我想了几个方法:
这种方式实现的问题是我必须在刀片模板中显示php变量,然后使用最终代码作为电子邮件的html。我想,这对拉拉维尔来说太难了。
另外一个问题是如果我将{{$ var}}存储在数据库中的模板文本中 - 它将显示为文本,刀片编译器不会处理它。
这种方式可以解决php var显示的问题,但我仍然不知道如何使用Mail :: send中的最终代码,因为Laravel只允许使用模板的名称,而不是HTML,因为我知道...
我想到以下方式:
start
但我不想使用它,因为我想使用Mail :: queue()来排队电子邮件,我不知道如何将它用于PHP mail()。
感谢大家的回复。
答案 0 :(得分:3)
您可以创建自己的变量语法,并将电子邮件模板存储为数据库中的文本。例如,您可以将每个变量存储为${VARIABLE_KEY}
字符串。
然后在电子邮件准备期间,您应该将所有此类构造解析为其真实值。我不知道哪些变量是必需的,但在电子邮件准备期间,您应该执行以下步骤:
${VARIABLE_KEY}
替换为其实际值。 您可以使用正则表达式进行搜索和替换,但也可以使用str_replace
等函数。例如,如果要将当前用户的电子邮件粘贴到电子邮件中(模型User
的表格中有电子邮件字段),则可以创建变量:$ {user.name}然后手动替换使用简单的str_replace
函数:
$ variables ['$ {user.name}'] = Auth :: user() - >电子邮件; str_replace(array_keys($ variables),array_values($ variables),$ yourEmailTemplateBody);
此外,您不仅可以在电子邮件模板正文中使用相同的方法进行替换,也可以在电子邮件主题中进行替换。
然后你必须创建自己的类,扩展Laravel Illuminate\Mail\Mailable
类。在这个类中,您应该定义build
方法,您不仅可以使用视图的名称,还可以使用一些其他参数,例如“常规”视图,例如:
class SomeClassName extends Mailable
{
public function build()
{
$email = $this->view('mail.common', [
'mail_header' => 'some header',
'mail_footer' => 'some footer',
])->subject('Your subject');
...
return $email;
}
例如,在您的视图中,您可以使用一些额外参数存储整个电子邮件的布局:页脚和标题,如我的示例所示。
此外,您可以为${VARIABLE_NAME}
构造创建更复杂的语法,例如,VARIABLE_NAME
可以是PHP或Laravel表示法中的方法定义,即:SomeClass::someStaticMethod
。您可以检测到此案例并通过Laravel Service Container解决SomeClass
。它也可以是object.field
表示法,例如user.email
,其中user
是当前的Auth :: user()。
您可以阅读有关撰写邮寄的信息in Laravel documentation
答案 1 :(得分:1)
我昨天为一个项目做了这个,发现了一篇很好的帖子,更详细地描述了亚历山大的答案。核心是使用此方法创建EmailTemplate
模型:
public function parse($data)
{
$parsed = preg_replace_callback('/{{(.*?)}}/', function ($matches) use ($data) {
list($shortCode, $index) = $matches;
if( isset($data[$index]) ) {
return $data[$index];
} else {
throw new Exception("Shortcode {$shortCode} not found in template id {$this->id}", 1);
}
}, $this->content);
return $parsed;
}
使用示例:
$template = EmailTemplate::where('name', 'welcome-email')->first();
Mail::send([], [], function($message) use ($template, $user)
{
$data = [
'firstname' => $user->firstname
];
$message->to($user->email, $user->fullname)
->subject($template->subject)
->setBody($template->parse($data));
});
有关所有详细信息(数据库迁移,单元测试等),请参阅http://tnt.studio/blog/email-templates-from-database上的原始帖子
答案 2 :(得分:1)
您可以简单地使用这个很棒的laravel软件包:
https://github.com/Qoraiche/laravel-mail-editor
功能(来自自述文件):