Laravelにはパスワードリセットの機能がついているので実装自体はしなくても済みます。
メールの文章は実際にそのまま使うことはないと思うので、文章やデザインを独自のものにしましょう。
この記事ではLaravelのパスワードリセットで送信されるメールを独自の文章・デザインに変える方法を記録します。
Contents
独自の通知クラス
さくっと作成
まずは独自の通知を作成しましょう。
下記コマンドを実行します。
1 | php artisan make:notification PasswordResetNotification |
名前はCustomPasswordResetなど自由に付けてください。
app/Notifications/PasswordResetNotification.phpが作成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | <?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; class PasswordResetNotification extends Notification { use Queueable; /** * Create a new notification instance. * * @return void */ public function __construct() { // } /** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['mail']; } /** * Get the mail representation of the notification. * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { return (new MailMessage) ->line('The introduction to the notification.') ->action('Notification Action', url('/')) ->line('Thank you for using our application!'); } /** * Get the array representation of the notification. * * @param mixed $notifiable * @return array */ public function toArray($notifiable) { return [ // ]; } } |
必要に応じて独自通知を編集する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | <?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; class PasswordResetNotification extends Notification { use Queueable; /** * Token * @var string */ public $token; /** * Create a new notification instance. * * @return void */ public function __construct($token) { $this->token = $token; } /** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['mail']; } /** * Get the mail representation of the notification. * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { return (new MailMessage) ->subject(__('Reset Password')) ->view('emails.reset') ->action(__('Reset Password'), url('password/reset', $this->token)); } /** * Get the array representation of the notification. * * @param mixed $notifiable * @return array */ public function toArray($notifiable) { return [ // ]; } } |
件名やメール本文のviewファイルを好きなものにしましょう。
ユーザーモデルを編集
ユーザーモデルを編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php namespace App; // 独自通知を! use App\Notifications\PasswordResetNotification; class User extends Authenticatable { /** * このメソッドを追加! * @param string $token * @return void */ public function sendPasswordResetNotification($token) { $this->notify(new PasswordResetNotification($token)); } } |
独自のViewファイルを作成
独自通知クラスで指定したファイルを作成
今回の例では「emails.reset」としているので
「resources/views/emails/reset.blade.php」を作成しましょう。
オリジナルを参考にする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | @component('mail::message') {{-- Greeting --}} @if (! empty($greeting)) # {{ $greeting }} @else @if ($level === 'error') # @lang('Whoops!') @else # @lang('Hello!') @endif @endif {{-- Intro Lines --}} @foreach ($introLines as $line) {{ $line }} @endforeach {{-- Action Button --}} @isset($actionText) <?php switch ($level) { case 'success': case 'error': $color = $level; break; default: $color = 'primary'; } ?> @component('mail::button', ['url' => $actionUrl, 'color' => $color]) {{ $actionText }} @endcomponent @endisset {{-- Outro Lines --}} @foreach ($outroLines as $line) {{ $line }} @endforeach {{-- Salutation --}} @if (! empty($salutation)) {{ $salutation }} @else @lang('Regards'),<br>{{ config('app.name') }} @endif {{-- Subcopy --}} @isset($actionText) @component('mail::subcopy') @lang( "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\n". 'into your web browser: [:actionURL](:actionURL)', [ 'actionText' => $actionText, 'actionURL' => $actionUrl, ] ) @endcomponent @endisset @endcomponent |
自由にviewを編集
1 2 3 4 5 6 7 8 9 10 11 12 | パスワードを リセットするには、次のリンクをクリックしてください。 {{ $actionText }}: <a href="{{ $actionUrl }}">{{ $actionUrl }}</a> このリンクをクリックしても機能しない場合は、URL をコピーして新しいブラウザ ウィンドウに貼り付けてください。 このメールに心当たりがない場合、他の方がパスワードをリセットする際に誤ってお 客様のメール アドレスを入力した可能性があります。リクエストした覚えがない場 合は、何も行わずにこのメールを破棄してください。 ○○○をご利用いただきありがとうございます。 |
確認
メール本文まで作成できたら実際にパスワードリセットのリクエストをしてメールの送信を確認しましょう。