Laravel9でユーザ登録に確認画面を追加してみる


laravel/uiなどのライブラリを使用して認証機能を作成すると、一発で登録機能も自動で作成されて便利ですが、確認画面がありません。
調べた限り、デフォルトでは確認画面は用意されておらず、カスタマイズして作成する必要があるようです。(2022年9月時点.Laravel9)

なおここで紹介するやり方は、公式ドキュメントなどは参照せずソースを触りながら見つけたやり方ですが、ご了承ください。


※laravel/uiは導入されている前提で進めさせていただきます。




概要

データの受け渡しにはセッションを使用します。
修正するファイルは下記になります。

ビュー
 ・resources/views/auth/confirm.blade.php(新規)
 ・resources/views/auth/register.blade.php(修正)

コントローラ
 ・app/Http/Controllers/Auth/RegisterController.php(修正)

ルート
 ・routes/web.php(修正)




ビュー

resources/views/auth/confirm.blade.php(新規)

resources/views/auth/register.blade.phpをコピーしてresources/views/auth/confirm.blade.phpを作成して、formの遷移先とformタグの中を修正します。

<form method="POST" action="{{ url('register/complete') }}">    //修正

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

<div class="row mb-3">
    <label for="name" class="col-md-4 col-form-label text-md-end">{{ __('Name') }}</label>
    <div class="col-md-6">
        {{session()->get('name')}}
    </div>
</div>
<div class="row mb-3">
    <label for="email" class="col-md-4 col-form-label text-md-end">{{ __('Email Address') }}</label>
    <div class="col-md-6">
        {{session()->get('email')}}
    </div>
</div>
<div class="row mb-0">
    <div class="col-md-6 offset-md-4">
        <button type="submit" class="btn btn-primary">
            {{ __('Register') }}
        </button>
    </div>
</div>


resources/views/auth/register.blade.php(修正)

resources/views/auth/register.blade.phpのフォームの遷移先と、ボタンの名前を変更します。

<form method="POST" action="{{ url('register/confirm') }}">    //修正

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

<button type="submit" class="btn btn-primary">
    Confirm    //修正
</button>





コントローラ

app/Http/Controllers/Auth/RegisterController.phpに下記を追記します。

一つ目と二つ目はバリデーション時と登録実行時に、セッションデータを渡すようにしています。
三つめは確認用のメソッドです。バリデーション実行後、リクエストデータをセッションに入れ、確認画面を読み込んでいます。

protected function validator(array $data)
{
    $data = session()->all();                                       //追記
    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ]);
}

protected function create(array $data)
{
    $data = session()->all();                                       //追記 
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);
}

public function confirm()                                           //追記
{                                                                   //追記
    $request = request();                                           //追記
    $request->validate([                                            //追記
        'name' => ['required', 'string', 'max:255'],                //追記
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],  //追記
        'password' => ['required', 'string', 'min:8', 'confirmed'], //追記
    ]);                                                             //追記
    foreach($request->all() as $key => $val){                       //追記
        $request->session()->put($key, $request->$key);             //追記
    }                                                               //追記
    return view('auth.confirm');                                    //追記
}                                                                   //追記





ルーティング

routes/web.phpに下記3行を追記します。

Route::redirect('/register/confirm', '/register');    //追記
Route::post('/register/confirm', [App\Http\Controllers\Auth\RegisterController::class,'confirm']);    //追記
Route::post('/register/complete', [App\Http\Controllers\Auth\RegisterController::class,'register']);  //追記





以上になります!

コメント

タイトルとURLをコピーしました