Search code examples
phplaravelnotificationslaravel-5.3

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 \Illuminate\Support\HtmlString('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.


Solution

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

    For example you can create this class in 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);
        }
    }
    

    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 :D