Laravel:通知中的HTML

时间:2017-01-05 13:21:23

标签: php laravel notifications laravel-5.3

我正在使用默认的notification system(Laravel 5.3)发送电子邮件。我想在消息中添加HTML标记。这不起作用(它以纯文本形式显示强标签):

var javascriptArray = <%= j ruby_array.to_json %>

我知道这是正常的,因为文本显示在邮件通知模板的public function toMail($notifiable) { return (new MailMessage) ->subject('Info') ->line("Hello <strong>World</strong>") ->action('Voir le reporting', config('app.url')); } 中。我尝试使用与{{ $text }}助手中相同的系统:

csrf_field()

但它不起作用:它显示为纯文本。

我可以在不更改视图的情况下发送HTML标记吗?(我不想更改视图:保护文本适用于所有其他情况)。希望它足够清楚,如果不是抱歉。

5 个答案:

答案 0 :(得分:7)

运行php artisan vendor:publish命令,将email.blade.phpresources/views/vendor/notifications目录复制到vendor

打开此视图,并在两个位置将{{ $line }}更改为{!! $line !!}。在Laravel 5.3中,视图中有101137行。

这将显示unescaped line字符串,您可以在通知电子邮件中使用HTML标记。

答案 1 :(得分:5)

好吧,您还可以创建一个扩展MailMessage类的新MailClass。

例如,您可以在app\Notifications

中创建此类
<?php

namespace App\Notifications;

use Illuminate\Notifications\Messages\MailMessage;

class MailExtended extends MailMessage
{
    /**
     * The notification's data.
     *
     * @var string|null
     */
    public $viewData;

    /**
     * Set the content of the notification.
     *
     * @param string $greeting
     *
     * @return $this
     */
    public function content($content)
    {
        $this->viewData['content'] = $content;

        return $this;
    }

    /**
     * Get the data array for the mail message.
     *
     * @return array
     */
    public function data()
    {
        return array_merge($this->toArray(), $this->viewData);
    }
}

然后在通知中使用:

相反:

return (new MailMessage())

将其更改为:

return (new MailExtended())

然后您可以在通知视图中使用content var。例如,如果您发布了通知视图(php artisan vendor:publish),则可以在email.blade.php中修改resources/views/vendor/notifications并附加:

@if (isset($content))
<hr>
    {!! $content !!}
<hr>
@endif

我们这样做,就像一个魅力:D

答案 2 :(得分:2)

截至 2021 年 5 月,HtmlString 类工作正常。 我已经在 Laravel 7、8 中做到了这一点。

试试这个,它应该可以工作

->line(new HtmlString("<b>This is bold HTML text</b>"))

确保在顶部导入这个

use Illuminate\Support\HtmlString;

答案 3 :(得分:1)

对于任何遵循@ eric-lagarda方法的人,请记住不要像在视图中通常那样在自定义email.blade.php视图中标记内容,因为它将被Laravel的markdown解析器解释为代码,将整个content HTML包装在<code> HTML标记中。这让我很头疼但是由于this回答,我设法弄清楚问题是什么。 因此,您附加到email.blade.php视图的代码将是这样的(请注意大括号前面缺少的空格/列表):

@if (isset($content))
<hr>
{!! $content !!}
<hr>
@endif

答案 4 :(得分:0)

如果您只想向模板添加一些基本样式,则可以在line()方法中使用Markdown,而无需修改任何其他代码。