概要
一般的なアプリケーションで会員登録する場合、
1. 仮登録する
2. メールにURLが届く
3. URLをクリックして登録が完了する
という流れがありますよね
これができるようにLaravelのファイルをいじっていきましょう
前提
Laravel7で行います
あらかじめAuth機能を使えるようにしておいてください
% composer require laravel/ui
% php artisan ui vue --auth
% npm install && npm run dev
また、メールが送れるようにconfig/mail.phpや.envファイルを変更しておいてください
方法
さすがLaravelさん、こういう時のためにちゃんと用意してあるんですね
なんと、いじるファイルはUser.phpとweb.phpの2つだけ
必要な手順は以下の通り
- マイグレーション
- User.phpの編集
- web.phpの編集
マイグレーション
% php artisan migrate
を実行してください
すでに実行している場合は必要ありません
これによって、メール確認に必要なemail_verified_atカラムを含んだusersテーブルが作成されます
User.php
class User extends Authenticatable implements MustVerifyEmail
Userクラスにimplements MustVerifyEmailを追加してください
これに必要なuseはすでに書かれてあります(さすが)
これによって、メール確認に必要な処理(URL生成やメール送信など)が追加されます
web.php
Auth::routes(['verify' => true]);
Auth::routes()の引数に['verify' => true]を追加してください
これによって、メール確認に関連するルーティングが使用されます
カスタマイズ
ページの保護
仮登録や本登録を行うということは、本登録したユーザーだけがアクセスできるページがあるわけです
middlewareにverifiedを指定することで、ルートを保護できます
例を以下に示します
Route::get('welcome', function() {
......
})->middleware('verified');
Route::group(['middleware' => ['auth', 'verified']], function() {
Route::get('index', HelloController@index);
// このようにして保護したいルートをここに書く
}
ビュー
必要なビューは前提で実行したコマンドによって、すでに生成されています
メール確認のビューはresources/views/auth/verify.blade.phpにあります
自分の好きなようにカスタマイズしましょう
確認後のリダイレクト
メールアドレスを確認した後、自動的に表示させるページがあるといいですよね
デフォルトでは'/home'にリダイレクトすることになっていますが、これを変更するにためには、VerificationController.phpのredirectToにリダイレクト先を指定してください
RouteServiceProvider.phpのHOMEを変更する手段もありますが、こちらは、他のところでRouteServiceProvider::HOMEを参照している部分も一緒に変更できます
protected $redirectTo = '/home';
public const HOME = '/home'
日本語化
確認用のメールの内容を日本語化します
まず、以下のコマンドを実行します
php artisan make:notification VerifyEmailNotification
生成されたVerifyEmailNotification.phpの親クラスをVerifyEmailにし、toMailメソッドを以下のように変更します(オーバーライド)
use Illuminate\Auth\Notifications\VerifyEmail;
class VerifyEmailNotification extends VerifyEmail
{
...(省略)...
public function toMail($notifiable)
{
$verificationUrl = $this->verificationUrl($notifiable);
if (static::$toMailCallback) {
return call_user_func(static::$toMailCallback, $notifiable, $verificationUrl);
}
return (new MailMessage)
->subject('メールアドレスの確認')
->line('以下のボタンをクリックして、メールアドレスの確認を行ってください。')
->action('メールアドレスの確認', $verificationUrl)
->line('もし心当たりがなければ、メールを破棄してください。');
}
}
最後に、app\User.phpに以下のメソッドを追加します(オーバーライド)
public function sendEmailVerificationNotification()
{
$this->notify(new VerifyEmailNotification());
}
おわり
簡単でしたね
公式ドキュメントやReadoubleを読めばいいので、ここで説明する必要なかったかもしれませんが、備忘録ということで書いてみました