Laravel:通知中的HTML

tvz2xvvm  于 2022-11-26  发布在  其他
关注(0)|答案(5)|浏览(99)

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

public function toMail($notifiable)
{
    return (new MailMessage)
                ->subject('Info')
                ->line("Hello <strong>World</strong>")
                ->action('Voir le reporting', config('app.url'));
}

我知道这是正常的,因为在邮件通知模板中,文本显示在{{ $text }}中。我尝试使用与csrf_field()助手中相同的系统:

->line( new \Illuminate\Support\HtmlString('Hello <strong>World</strong>') )

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

是否可以在不更改视图的情况下发送HTML标记?(我不想更改视图:其他情况下,保护文本是可以的)。希望它足够清楚,如果不够,对不起。

u59ebvdq

u59ebvdq1#

截至2022年11月,HtmlString类运行得非常好。我已经在Laravel 7、8和9上做过了。
试试这个,应该能用

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

请确保在顶部导入

use Illuminate\Support\HtmlString;
qc6wkl3g

qc6wkl3g2#

运行php artisan vendor:publish命令,将email.blade.phpvendor目录复制到resources/views/vendor/notifications
打开此视图,在两个位置将{{ $line }}更改为{!! $line !!}。在Laravel 5.3中,这些是视图中的101137线。
这将显示未转义的line字符串,允许您在通知电子邮件中使用HTML标记。

6rqinv9w

6rqinv9w3#

您也可以创建一个新的MailClass来扩展MailMessage类。
例如,可以在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),你可以在resources/views/vendor/notifications中编辑email.blade.php,并附加以下内容:

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

我们这样做,工作起来像一个魅力:D

mm9b1k5b

mm9b1k5b4#

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

8wtpewkr

8wtpewkr5#

对于任何像我一样采用@eric-lagarda方法的人来说,请记住不要像在视图中那样在自定义email.blade.php视图中对内容进行Tab键操作,因为它会被Laravel的markdown解析器解释为代码,将整个content HTML Package 在<code> HTML标签中。这让我很头疼,但多亏了this的回答,我设法弄清楚了问题所在。因此,要附加到email.blade.php视图中的代码将如下所示(请注意大括号前缺少空格/表格):

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

相关问题