ざっくり流れ
- authを有効にする
- ルーティングでメール認証を有効にする
- 既存のメール認証画面を日本語で書き換える
- 認証確認メールを日本語化にするためのNotificationを作成する
- Userモデルに諸々加筆する
make:authをまだしていなければ実行する
php artisan make:auth
php artisan migrate
これでauth関連が手早く実装される
ルーティングでメール認証を有効にする
- routes/web.php
// ⭐️ 既存のAuth::routes()に引数を追加
Auth::routes(['verify' => true]);
// ⭐️ メール認証済みのユーザーしか見れない画面は'verified'を指定する
Route::middleware(['verified'])->group(function () {
Route::get('/mypage', function () {
return view('mypage');
});
});
メール認証画面のviewを日本語化する
- resources/views/auth/verify.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">メールアドレス認証</div>
<div class="card-body">
@if (session('resent'))
<div class="alert alert-success" role="alert">
認証メールを再送しました。
</div>
@endif
<p>認証メールを送信しました。届いたメールをご確認の上、記載のリンクから登録を完了させてください。</p>
<p>※メールが届かない場合は、入力したアドレスに間違いがあるか、あるいは迷惑メールフォルダに入っている可能性がありますのでご確認ください。</p>
<p>認証メールを再送する場合はこちらをクリックしてください。</p>
<form class="d-inline" method="POST" action="{{ route('verification.resend') }}">
@csrf
<button type="submit"
class="btn btn-link p-0 m-0 align-baseline">メールを再送</button>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
認証確認メールを日本語化する
- 認証メールカスタマイズ用のNotificationクラスを作る
php artisan make:notification VerifyEmail
- app/Notifications/VerifyEmail.php
<?php
namespace App\Notifications;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Lang;
use Illuminate\Support\Facades\URL;
class VerifyEmail extends Notification
{
/**
* The callback that should be used to build the mail message.
*
* @var \Closure|null
*/
public static $toMailCallback;
/**
* Get the notification's channels.
*
* @param mixed $notifiable
* @return array|string
*/
public function via($notifiable)
{
return ['mail'];
}
/**
* Build the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
$verificationUrl = $this->verificationUrl($notifiable);
if (static::$toMailCallback) {
return call_user_func(static::$toMailCallback, $notifiable, $verificationUrl);
}
return (new MailMessage)
->subject(Lang::get('message.Mail.Verify.Title'))
->view('emails.verify-email', ['url' => $this->verificationUrl($notifiable), 'user' => $notifiable]);
}
/**
* Get the verification URL for the given notifiable.
*
* @param mixed $notifiable
* @return string
*/
protected function verificationUrl($notifiable)
{
return URL::temporarySignedRoute(
'verification.verify',
Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
[
'id' => $notifiable->getKey(),
'hash' => sha1($notifiable->getEmailForVerification()),
]
);
}
/**
* Set a callback that should be used when building the notification mail message.
*
* @param \Closure $callback
* @return void
*/
public static function toMailUsing($callback)
{
static::$toMailCallback = $callback;
}
}
- resources/emails/verify-email.blade.php を新規作成
<h2>以下の認証リンクをクリックしてください。</h2>
<a href="{{ $url }}" rel="nofollow" target="_blank">メールアドレスを認証する</a>
<p>
※「ログインして本登録を完了する」ボタンをがクリックできない場合は以下のURLをコピーしてブラウザに貼り付けてください。<br>
{{ $url }}
</p>
<p>※こちらのメールは送信専用のメールアドレスより送信しています。恐れ入りますが、直接返信しないようお願いします。</p>
Userモデルにメール認証に必要なクラスを実装する
- app/Models/User.php
<?php
namespace App\Models;
use App\Notifications\VerifyEmail; // ⭐️ 作成した認証メール日本語化用のNotification
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable implements MustVerifyEmail // ⭐️ implements追加
{
use HasFactory, Notifiable;
// ...(省略)
/**
* ⭐️ 認証メールを日本語化
*/
public function sendEmailVerificationNotification()
{
$this->notify(new VerifyEmail());
}
}
sendEmailVerificationNotification()
メソッドをオーバーライドすることで
認証メール送信時に今回作成したNotificationが使用されるようになる
認証メールを任意のタイミングで送りたい場合はこちら
Laravelでメール認証を日本語にしたときのメモ