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 会員情報変更


