Laravel5.4、ユーザー登録完了処理の変更
タグ: Laravel5.4
「ソースを読みましょう」強化週間第3段です。
ユーザーからフォームを埋めてもらい、送信してもらえたら、そのユーザーを仮登録とし、メール中の確認リンクを押してもらうまでは、ログインさせたくないことも多いかと思います。前記事はログインの処理について紹介しました。
今回は、ユーザー登録後の処理の変更です。
デフォルト動作
Laravelの認証のデフォルトでは、登録時にユーザーをログイン状態にします。メールでの認証を行わないというのも流行ってきました。しかし、メール送信が必要なサービスを提供する場合は、それでは困ってしまいます。
また、登録時にメッセージが表示されません。これは、よくありません。
そこで、登録時にログイン状態にさせず、ログイン後のリダイレクト先で「登録しました」メッセージを表示する方法を考えてみましょう。
登録処理の変更
登録処理を全て自前で書いてしまうという手もあります。さほど面倒ではありませんが、こうした定形処理を減らせるのはLaravelの魅力の一つです。前2記事と同様に、make:authによるスカフォールドで生成される、コントローラーを変更する方針としましょう。
RegisterControllerで使用するRegistersUsersが提供する、registerメソッドがユーザー登録を処理しています。登録フォームの送信先、URI /registerへPOSTメソッドで送信した場合に実行されるアクションメソッドです。
このメソッドをコピペし、RegisterControllerでオーバーライドしましょう。そして、ログイン処理を潰し、リダイレクトにメッセージを付けるだけです。
/**
* ユーザー登録処理
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function register( Request $request )
{
// バリデーション
$this->validator( $request->all() )->validate();
// ユーザー登録のLaravelシステムイベント発行
event( new Registered( $user = $this->create( $request->all() ) ) );
// 登録時はログインさせない
// $this->guard()->login( $user );
return redirect('/')
->with('message', '仮登録しました。登録アドレスへ確認メールが届きます。中のボタンを押し、登録処理を完了してください。');
}
ログイン処理をコメントにし、最後のreturn文で直接リダイレクト先を指定し、メッセージをフラッシュデータとしてセッションに保存します。
messageキーでセッションに保存されますので、それを表示すれば良いわけです。全体の共通テンプレートへ、以下のようなコードを入れます。
{{-- 通知メッセージ --}}
@if (session()->has('message'))
<div class="row">
<div class="callout small success small-12">
<p>{{ session()->get('message') }}</p>
</div>
</div>
@endif
これだけです。しかし、まあ、registerのロジックをまるまるそのままコピペするのは、何だかおしゃれでないですね。もう一つ方法があります。
完了後のメソッド
もともと、オリジナルのregisterメソッドの最後は、以下のようなreturn文です。
return $this->registered($request, $user)
?: redirect($this->redirectPath());
つまり、registeredメソッドが何かを返したら、それをそのまま返し、そうでなければredirectPathメソッドで、redirectToメソッドの返すURIの文字列か、redirectToプロパティの値のURIへリダイレクトします。
redirectToはリダイレクト先のURIを文字列でお手軽に指定できますが、メッセージを渡すなどの処理ができません。ロジックが必要な場合は、registeredメソッドをオーバーライドします。
RegistersUsersトレイトのregisteredメソッドは空です。つまり、オーバーライドされるのを待っているようなものです。今回はこのメソッドを使用し、ログインさせず、リダイレクト後にメッセージを表示しましょう。ちなみに、テンプレートビューのサンプルコードは、前記と同じですので省略です。
/**
* 登録完了時に呼び出されるメソッド。
*
* もとのメソッドは空のためオーバーライド専用らしい。
*/
protected function registered( Request $request, $user )
{
// registerメソッド内で、ログイン処理しているため
// ログアウトさせる
$this->guard()->logout();
return redirect( '/' )
->with( 'message', '仮登録しました。登録アドレスへ確認メールが届きます。中のボタンを押し、登録処理を完了してください。' );
}
registerメソッドでログインされるわけですから、まずログアウトしています。
それから、ルートページへリダイレクトし、その際にmessageをキーとして登録メッセージをセッションへフラッシュデータとして保存しています。このフラッシュデータが、テンプレート側にいれたコードで読み出され、表示されるわけです。
まとめ
「コードを読もう」強化週間も3本目ともなると、いささかしつこいので、これで止めます。
ドキュメントにも書かれてなくて、ネットに質問されたり、回答が少なかったりするのは、ほとんどの技術者の方はコードを読んでいるからです。
幸いなことに、Laravelのコードは読みやすくなっています。最初はIDEの移動機能を活用しましょう。すぐに、楽しくコアコードが読めるようになります。