Laravel 8でログイン機能実装2 ログインID導入
Laravelのパッケージとして利用できるログイン機能のカスタマイズシリーズ第二弾として
ログインIDを導入致します。
最近は「メールアドレス」と「パスワード」でログインできるサイトが一般的ですが
ログインIDを使えるようにしたいという要望も一定数ございますので、今回はこの対応をご紹介いたします。
サイト構成
- 会員登録 ← ここにログインIDを追加
- ログイン ← ログインIDでログインできるようにする
- 会員メニュー
- ログアウト
- パスワード再設定
実装
手順は下記の通りです。
- 会員登録画面を修正
- 会員登録用controllerを修正
- ログイン画面を修正
- ログイン用controllerを修正
まず会員登録の機能を修正し、会員が作成できることを確認できた後
ログイン機能を修正していきます。
会員登録画面の修正
nameの部分をlogin_idに修正します。
※注! 一括置換すると不要な部分も修正してしまいますので、下記をご覧になりながら修正ください
こちらが完成形です
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">{{ __('Register') }}</div> <div class="card-body"> <form method="POST" action="{{ route('register') }}"> @csrf <div class="form-group row"> <label for="login_id" class="col-md-4 col-form-label text-md-right">{{ __('login_id') }}</label> <div class="col-md-6"> <input id="login_id" type="text" class="form-control @error('login_id') is-invalid @enderror" name="login_id" value="{{ old('login_id') }}" required autocomplete="login_id" autofocus> @error('login_id') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div> <div class="form-group row"> <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label> <div class="col-md-6"> <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email"> @error('email') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div> <div class="form-group row"> <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label> <div class="col-md-6"> <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password"> @error('password') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div> <div class="form-group row"> <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label> <div class="col-md-6"> <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password"> </div> </div> <div class="form-group row mb-0"> <div class="col-md-6 offset-md-4"> <button type="submit" class="btn btn-primary"> {{ __('Register') }} </button> </div> </div> </form> </div> </div> </div> </div> </div> @endsection
会員登録用controllerの修正
修正するのは、バリデーション機能とデータ生成機能の2か所です。
バリデーション
protected function validator(array $data) { return Validator::make($data, [ 'login_id' => ['required', new alpha_num_check(), 'max:20','unique:users'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'string', 'min:8', 'confirmed'], ]); }
login_idに対してのバリでショーンルールを追加しています。
項目 | 意味 |
---|---|
required | 必須入力です |
new alpha_num_check() ※追加開発機能 | 半角英数であることをチェック 公式サイト記載のalpha_numでは残念ながら日本語文字列はスルーされてチェックされません そのため、追加機能を開発しております。 詳細は半角英数のバリデーションをご覧ください |
max:20 | 最大20文字 |
unique:users | usersテーブル内でのlogin_idに対しての重複チェック |
データ生成
protected function create(array $data) { return User::create([ 'login_id' => $data['login_id'], 'email' => $data['email'], 'password' => Hash::make($data['password']), ]); }
4行目でlogin_idへの登録機能を追加しております。
最後に、データベースの登録先を作成するため
migrationファイルを作成して、usersテーブルにlogin_idのカラムを追加します。
use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AddUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('users', function (Blueprint $table) { $table->string('login_id',20)->after('name')->comment('ログインID'); $table->unique(['login_id']); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('users'); } }
こちらを準備しmigrateコマンドをたたけば、カラムが追加されます。
php artisan migrate
ログイン画面の修正
会員登録画面と同様にnameと記載の部分をlogin_idに修正します。
こちらも誤って修正しすぎないように注意が必要です。
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">{{ __('Login') }}</div> <div class="card-body"> <form method="POST" action="{{ route('login') }}"> @csrf <div class="form-group row"> <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('login_id') }}</label> <div class="col-md-6"> <input id="login_id" type="text" class="form-control @error('login_id') is-invalid @enderror" name="login_id" value="{{ old('login_id') }}" required autocomplete="login_id" autofocus> @error('login_id') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div> <div class="form-group row"> <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label> <div class="col-md-6"> <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password"> @error('password') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div> <div class="form-group row"> <div class="col-md-6 offset-md-4"> <div class="form-check"> <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}> <label class="form-check-label" for="remember"> {{ __('Remember Me') }} </label> </div> </div> </div> <div class="form-group row mb-0"> <div class="col-md-8 offset-md-4"> <button type="submit" class="btn btn-primary"> {{ __('Login') }} </button> @if (Route::has('password.request')) <a class="btn btn-link" href="{{ route('password.request') }}"> {{ __('Forgot Your Password?') }} </a> @endif </div> </div> </form> </div> </div> </div> </div> </div> @endsection
ログイン用controllerを修正
本機能を修正するには、拡張しているAuthenticatesUsersをまず確認する必要があります。
ここには、認証機能の対象とするカラムが下記のように定義されております。
public function username() { return 'email'; }
これをログイン用controller側で下記のようにオーバーライド致します。
public function username() { return 'login_id'; }
これで認証に利用するカラムをログインIDに変更することができました。
これで会員登録とログイン機能に「ログインID」を追加する対応が完了しました。
Laravelログイン機能連載一覧
- Laravel 8でログイン機能実装1 基本機能
- Laravel 8でログイン機能実装2 ログインIDの導入 ←いまここ
- Laravel 8でログイン機能実装3 会員登録時の入力項目追加
- Laravel 8でログイン機能実装4 ValueObjectとバリデーション
- Laravel 8でログイン機能実装5 会員情報変更