[Laravel 5.7]パスワード変更フォームの作り方

↓のようなパスワード変更フォームを作っていきます。

 

/routes/web.php

Route::get('changepassword', 'HomeController@showChangePasswordForm');
Route::post('changepassword', 'HomeController@changePassword')->name('changepassword');

/changepasswordにフォームを作り、そこにPOSTメソッドでパスワード変更用のchangePassword()を呼び出します。
コントローラーはなんでもいいのですが、今回はHomeControllerに作ります。

フォームを表示するメソッドです。
/app/Http/Controllers/HomeController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;
use Hash;

class HomeController extends Controller
{
    ...

    public function showChangePasswordForm() {
        return view('auth.changepassword');
    }

フォームのビューです。
/resources/views/auth/changepassword.blade.php

<div class="container">
  <div class="row justify-content-center">
    <div class="col-md-8">
      <div class="card">
        <div class="card-header">パスワード変更</div>

        @if (session('change_password_error'))
          <div class="container mt-2">
            <div class="alert alert-danger">
              {{session('change_password_error')}}
            </div>
          </div>
        @endif

        @if (session('change_password_success'))
          <div class="container mt-2">
            <div class="alert alert-success">
              {{session('change_password_success')}}
            </div>
          </div>
        @endif

        <div class="card-body">
          <form method="POST" action="{{route('changepassword')}}">
            @csrf
            <div class="form-group">
              <label for="current">
                現在のパスワード
              </label>
              <div>
                <input id="current" type="password" class="form-control" name="current-password" required autofocus>
              </div>
            </div>
            <div class="form-group">
              <label for="password">
                新しいのパスワード
              </label>
              <div>
                <input id="password" type="password" class="form-control" name="new-password" required>
                @if ($errors->has('new-password'))
                  <span class="help-block">
                    <strong>{{ $errors->first('new-password') }}</strong>
                  </span>
                @endif
              </div>
            </div>
            <div class="form-group">
              <label for="confirm">
                新しいのパスワード(確認用)
              </label>
              <div>
                <input id="confirm" type="password" class="form-control" name="new-password_confirmation" required>
              </div>
            </div>
            <div>
              <button type="submit" class="btn btn-primary">変更</button>
            </div>
          </form>
        </div>
      </div>
    </div>
  </div>
</div>

次にパスワードを変更するメソッドです。
/app/Http/Controllers/HomeController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;
use Hash;

class HomeController extends Controller
{
    ...

    public function changePassword(Request $request) {
        //現在のパスワードが正しいかを調べる
        if(!(Hash::check($request->get('current-password'), Auth::user()->password))) {
            return redirect()->back()->with('change_password_error', '現在のパスワードが間違っています。');
        }

        //現在のパスワードと新しいパスワードが違っているかを調べる
        if(strcmp($request->get('current-password'), $request->get('new-password')) == 0) {
            return redirect()->back()->with('change_password_error', '新しいパスワードが現在のパスワードと同じです。違うパスワードを設定してください。');
        }

        //パスワードのバリデーション。新しいパスワードは6文字以上、new-password_confirmationフィールドの値と一致しているかどうか。
        $validated_data = $request->validate([
            'current-password' => 'required',
            'new-password' => 'required|string|min:6|confirmed',
        ]);

        //パスワードを変更
        $user = Auth::user();
        $user->password = bcrypt($request->get('new-password'));
        $user->save();

        return redirect()->back()->with('change_password_success', 'パスワードを変更しました。');
    }

$request->get()で入力されたパスワードを取得し、if文で入力されたパスワードが正しいかを判断して、間違っていたらredirect()->back()でフォーム画面に戻し、with()でフラッシュメッセージを表示します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です