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