Skip to content
Advertisement

Laravel: HTML in notification

I’m using the default notification system (Laravel 5.3) to send an email. I want to add HTML tags in message. This does not work (it displays the strong tags in plain text):

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

I know it’s normal because text is displayed in {{ $text }} in the mail notification template. I tried to use the same system as in csrf_field() helper:

->line( new IlluminateSupportHtmlString('Hello <strong>World</strong>') )

But it does not work: it displays strong as plain text.

Can I send HTML tags without changing the view? (I don’t want to change the view: protecting text is OK for all other cases). Hope it’s clear enough, sorry if not.

Advertisement

Answer

Well, you can also create a new MailClass extending the MailMessage Class.

For example you can create this class in appNotifications

<?php

namespace AppNotifications;

use IlluminateNotificationsMessagesMailMessage;

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);
    }
}

And then use in your notification:

Instead:

return (new MailMessage())

Change it to:

return (new MailExtended())

And then you can use content var in your notification views. For example if you publish the notification views (php artisan vendor:publish), you can edit email.blade.php in resources/views/vendor/notifications and append this:

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

We do it like this and works like a charm 😀

User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement