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の移動機能を活用しましょう。すぐに、楽しくコアコードが読めるようになります。