Laravel ではコンソールで、
php artisan make:authとするだけで管理画面を作ることができますが、初期状態ではメールアドレスとパスワードを使ってログインする構造になっています。そこで、メールアドレスだけでなくログインIDでもログインできるように改造します。
今回使用するバージョンは 5.6 です。
まずはデータベースのテーブル users にログインIDを保存するためのカラム login を追加します。
マイグレーションを行う場合は次のようになります。
CreateUsersTable
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('login')->unique();
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
ログイン名は重複のないもので、英数字が入るものとします。ここではシーディングでユーザーを追加します。
php artisan make:seeder UsersTableSeeder
public function run()
{
DB::table('users')->insert([
'name' => 'User 1',
'login' => 'user1',
'email' => 'user1@example.com',
'password' => bcrypt('secret')
]);
}
ログインに関係する処理は App\Http\Controllers\Auth\LoginController に書かれています。
実際には Illuminate\Foundation\Auth\AuthenticatesUsers の内容をオーバーライドしているだけなので AuthenticatesUsers の中身を見て動きを調べ、LoginController に実装することで上書きします。
追加するメソッドは次の2つです。「use Illuminate\Http\Request;」を上部に追記するのを忘れないで下さい。
public function username()
{
return 'login';
}
protected function attemptLogin(Request $request)
{
$username = $request->input($this->username());
$password = $request->input('password');
if (filter_var($username, \FILTER_VALIDATE_EMAIL)) {
$credentials = ['email' => $username, 'password' => $password];
} else {
$credentials = [$this->username() => $username, 'password' => $password];
}
return $this->guard()->attempt($credentials, $request->filled('remember'));
}
ログインフォームから login の入力値を受け取り、メールアドレスであれば email を調べ、そうでなければ login を調べてログインする仕組みです。
input の name を変更したのでビューも修正します。場所は resources/views/auth/login.blade.php です。
<div class="form-group row">
<label for="login" class="col-sm-4 col-form-label text-md-right">{{ __('Username / E-Mail Address') }}</label>
<div class="col-md-6">
<input id="login" type="text" class="form-control{{ $errors->has('login') ? ' is-invalid' : '' }}" name="login" value="{{ old('login') }}" required autofocus>
@if ($errors->has('login'))
<span class="invalid-feedback">
<strong>{{ $errors->first('login') }}</strong>
</span>
@endif
</div>
</div>
email となっていた箇所を login に置き換えました。type は text に変更となります。
これでメールアドレス、ログインIDのどちらでもログインできるようになります。
Similar Posts:
- [PHP]Laravelを使ったメールフォームの作り方
- [PHP]Symfonyを使ったメールフォームの作り方
- [PHP]Symfony 4 とデータベースを使ったCRUDアプリケーションの作り方
- [PHP]Silexの基本的なルーティング方法とTwigによるビューの作り方
- [PHP]PDOを使ったMySQLデータベースへの接続と基本操作
- [PHP, JS]jQueryのAjaxによるPHP、Javascript間の送受信(JSON)
- [PHP][jQuery]Ajax(非同期通信)を使ったチャット
- [PHP]LaravelでBladeテンプレートの読み込み元を一時的に変更する