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.
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