Почтовые уведомления в Laravel: Настраиваем шаблоны

Email-уведомления в Laravel

Laravel имеет удобную систему уведомлений, позволяющую оповещать пользователей по электронной почте, Slack и SMS. И ко всему этому прилагаются довольно неплохие дефолтные HTML-шаблоны. Но, что делать, если вы хотите изменить их дизайн?

Вот шаблон, о котором я говорю:

 

Давайте вспомним, как отправить такое письмо.

php artisan make:notification HelloUser

Эта комада сгенерирует класс app/Notifications/HelloUser.php — вот основная его часть:

class HelloUser extends Notification
{
    public function via($notifiable)
    {
        return ['mail'];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
                    ->line('The introduction to the notification.')
                    ->action('Notification Action', url('/'))
                    ->line('Thank you for using our application!');
    }

 

По умолчанию канал уведомлений настроен на mail и есть несколько готовых дефолтовых писем.

Вы создаете текст письма, используя такие методы, как ->line() или ->action(), и фактически в бэк-энде заполняете красивый HTML-шаблон.

Как отправить это уведомление?

$user = User::first(); // or any other way you get User instance
$user->notify(new HelloUser());

 

Мы не редактировали ни Blade-шаблон, ни HTML, где же находится наше письмо? Не всё так просто, по умолчанию его не будет в папке resources/views. Для начала вам нужно его опубликовать:

php artisan vendor:publish --tag=laravel-notifications

 

Результат:
Copied Directory [/vendor/laravel/framework/src/Illuminate/Notifications/resources/views] To [/resources/views/vendor/notifications]

До момента публикации шаблон лежит в вендорной папке Laravel (которую никогда не стоит редактировать). Вуаля, теперь мы можем редактировать шаблон.

Фактически, тут только один опубликованный шаблон — файл resources/views/vendor/notifications/email.blade.php:

@component('mail::message')
{{-- Greeting --}}
@if (! empty($greeting))
# {{ $greeting }}
@else
@if ($level == 'error')
# Whoops!
@else
# Hello!
@endif
@endif

{{-- Intro Lines --}}
@foreach ($introLines as $line)
{{ $line }}

@endforeach

{{-- Action Button --}}
@isset($actionText)

@component('mail::button', ['url' => $actionUrl, 'color' => $color])
{{ $actionText }}
@endcomponent
@endisset

{{-- Outro Lines --}}
@foreach ($outroLines as $line)
{{ $line }}

@endforeach

{{-- Salutation --}}
@if (! empty($salutation))
{{ $salutation }}
@else
Regards,
{{ config('app.name') }}
@endif

{{-- Subcopy --}}
@isset($actionText)
@component('mail::subcopy')
If you’re having trouble clicking the "{{ $actionText }}" button, copy and paste the URL below
into your web browser: [{{ $actionUrl }}]({{ $actionUrl }})
@endcomponent
@endisset
@endcomponent

 

Но погоди-ка, скажете вы — а где весь HTML? Он скрывается под другим слоем — компонентами уведомлений Laravel, основанными на языке Markdown.

В официальной документации Laravel упоминаются три компонента:

1. Кнопка:

@component('mail::button', ['url' => $url, 'color' => 'green'])
View Invoice
@endcomponent

 

2. Панель:

@component('mail::panel')
This is the panel content.
@endcomponent

 

3. Таблица:

@component('mail::table')
| Laravel       | Table         | Example  |
| ------------- |:-------------:| --------:|
| Col 2 is      | Centered      | $10      |
| Col 3 is      | Right-Aligned | $20      |
@endcomponent

 

И да, вы можете просто писать на Markdown вместо HTML, для некоторых это может быть очень удобно (в основном для разработчиков).

Но если вы хотите получить HTML и иметь возможность его редактировать, запустите:

php artisan vendor:publish --tag=laravel-mail

 

Произойдет:
Copied Directory [/vendor/laravel/framework/src/Illuminate/Mail/resources/views] To [/resources/views/vendor/mail]

Получим:

Теперь это выглядит знакомо и понятно. Мы можем, например, перейти к button.blade.php и добавить свой класс или текст:

<table class="wp-block-table action"><tbody><tr><td>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td align="center">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a class="button button-{{ $color or 'blue' }}" href="{{ $url }}" target="_blank" rel="noopener">{{ $slot }}</a></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td><td>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a class="button button-{{ $color or 'blue' }}" href="{{ $url }}" target="_blank" rel="noopener">{{ $slot }}</a></td>
</tr>
</tbody>
</table>
</td><td><a class="button button-{{ $color or 'blue' }}" href="{{ $url }}" target="_blank" rel="noopener">{{ $slot }}</a></td></tr><tr><td>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a class="button button-{{ $color or 'blue' }}" href="{{ $url }}" target="_blank" rel="noopener">{{ $slot }}</a></td>
</tr>
</tbody>
</table>
</td><td><a class="button button-{{ $color or 'blue' }}" href="{{ $url }}" target="_blank" rel="noopener">{{ $slot }}</a></td></tr><tr><td><a class="button button-{{ $color or 'blue' }}" href="{{ $url }}" target="_blank" rel="noopener">{{ $slot }}</a></td></tr></tbody></table>

 

Мы меняем {{ $slot }} на Click here: {{ $slot }}, и получаем такое письмо:

Наконец, вы можете делать даже ТЕМЫ с разными стилями CSS для каждой из них — например, разные письма для разных групп пользователей.

Для этого есть папка resources/views/mail/html/themes с файлом CSS. Дефолтную можно настроить в файле config/mail.php:

'markdown' => [
    'theme' => 'default',

    'paths' => [
        resource_path('views/vendor/mail'),
    ],
],

 

Вот таким образом настраиваются почтовые уведомления в Laravel. Вы можете найти больше информации в официальной документации.

 

Автор: Povilas Korop
Перевод: Алексей Широков

Наш Телеграм-канал — следите за новостями о Laravel.