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 😀