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