Найти тему
Битрикс и не только

Laravel: мой способ отправки письма с запросом на восстановление пароля

Всем привет!

При разработке своего проекта на Laravel столкнулся с проблемой: при отправке письма вылетала ошибка связанная с Notification. Ошибка была не совсем понятна, но суть проблемы была именно в составлении письма, т.к. запись в таблицу бд, запросе восстановления пароля, успешно создавалась.

Плюс ко всему, кроме отправки письма, мне требовалась ещё и его кастомизация. Решение данной проблемы я нашел в этой статье, но мою основную проблему это не решило.

Т.к. в своем проекте я уже реализовывал отправку почты с использованием Mailables (по данной инструкции), решил пойти эти же путём:

создаем новый класс ResetPasswordMail:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class ResetPasswordMail extends Mailable
{
use Queueable, SerializesModels;
/** @var string $token */
public $token;

/**
* Create a new message instance.
* @param $token
* @return void
*/
public function __construct(string $token)
{
$this->token = $token;

$this->subject = 'Восстановление пароля от аккаунта';

}

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this
->subject($this->subject)
->view('mail.auth.reset_password');
}
}

Далее создаем view mail/auth/reset_password.blade.php:

@extends('layouts.mail')

@section('content')
<p>Здравствуйте.</p>
<p>По Вашему требованию мы выслали ссылку на восстановления пароля. Что бы продолжить нажмите <a href="{{route('password.reset', ['token' => $token])}}">Восстановить</a></p>
<p>Если Вы не отправляли запрос на восстановление пароля, проигнорируйте это сообщение.</p>
@endsection

У меня уже был ранее создан layouts/mail

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<title>{{ config('app.name') }}</title>
</head>
<body>
<div class="content">
@yield('content')
</div>
</body>
</html>

И не забываем в модели пользователя создать метод sendPasswordResetNotification

use Illuminate\Support\Facades\Mail;
use App\Mail\ResetPasswordMail;
.......
public function sendPasswordResetNotification($token)
{
Mail::to($this->email)->send(
new ResetPasswordMail($token));
}

Не буду утверждать, что мой способ идеален, но, лично мое мнение, что это гораздо удобнее, чем городить костыли в шаблон resources\views\vendor\notifications\email.blade.php, а их, наверняка, придется городить, когда Вы захотите сделать красивое письмо.

Если у Вас есть замечания, к описанному методу, пожалуйста, напишите в комментарии.

Спасибо за внимание!