Laravelの基本はこちらから学べます

Laravel でスレッド掲示板を作成(中級)11 章マルチログイン機能




今回は前回に続けて開発を進めていきましょう。
前章をまだご覧になっていない方は以下から開発を始めましょう。

11 章:マルチログイン機能

油そば

今回は管理画面と、マルチログイン機能か。
何だか難しそうだな。

管理者ユーザーが不適切なコメント、スレッドを削除することができる機能をつけていきましょう。

では実装の流れを考えていきましょう。

  1. Admin の migration を作る(データを保存するため)。
  2. Admin.php モデルを作成する。
  3. Admin の Seeder を作る(Admin で使うログイン情報は初期値として入れておく)。
  4. User だけでなく Admin でログインできるように設定
  5. ログイン画面の作成
  6. Admin が各投稿を削除をできるようにする

上記の流れで実装をしていきましょう。

Admin の Seeder を作成する

ドキュメントを読みながら進めていきましょう。

データベース:シーディング
https://readouble.com/laravel/6.x/ja/seeding.html

laradock % docker-compose exec workspace php artisan make:seeder AdminsTableSeeder
Seeder created successfully. 

それでは、Admin 用のデータをシーディングしていきましょう。

AdminsTableSeeder.php

public function run()
    {
        DB::table('admins')->insert([
            'name' => 'Admin',
            'email' => 'admin@example.com',
            'password' => Hash::make('12345678'),
        ]);
    }

このように初期値を設定しました。
では、このシーダーを呼び出すために DatabaseSeeder.php に追記していきます。

DatabaseSeeder.php

public function run()
    {
        $this->call(AdminsTableSeeder::class);
    }

完了です。
これまでで、シーダクラスを書き上げられたのでシードしていきたいところですが、

シーダクラスを書き上げたら、Composerのオートローダを再生成するために、dump-autoloadコマンドを実行する必要があります。

https://readouble.com/laravel/6.x/ja/seeding.html

ドキュメントに習い、コマンドを打ち込んでからシードを行います。

laradock % docker-compose exec workspace composer dump-autoload

laradock % docker-compose exec workspace php artisan db:seed
Seeding: AdminsTableSeeder
Seeded:  AdminsTableSeeder (0.13 seconds)
Database seeding completed successfully.

では完了です。

念の為に、Laradock MySQL コンテナに入りデータが挿入されているかを確認してみましょう。
こちらは復習になります。

laradock % docker-compose exec mysql bash // コンテナに入る

root@:/# mysql -u default -proot // MySQL に defaul ユーザーでログイン

mysql> use 2ch
mysql> select * from admins;
// データが入っていれば OK

モデル作成

それでは、まだモデルを作成していなかった為追加していきましょう。
今回は、User.php を複製して、Admin.php を作成します(勿論、コマンドで作成していただいても構いません。)

Admin.php
// User.php と中身はほぼ同じ。

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class Admin extends Authenticatable
{
    use Notifiable;

    protected $guard = 'admin';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

auth.php の変更

それでは、Laravel で認証の設定がしてある auth.php に admin を追加していきましょう。

認証
https://readouble.com/laravel/6.x/ja/authentication.html

auth.php

// 略
'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],

        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
    ],
// 略

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],

        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],
// 略

'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
        'admins' => [
            'provider' => 'admins',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
    ],

ログイン画面を作成する。

では、ログイン画面を作成し、実際にログインできるようになるかを確認していきましょう。
今回は、Admin は先ほどの seeder で作成したユーザーだけとし新規登録機能は不要とします。

それでは、app\Http\Controllers\Auth をコピーし、app\Http\Controllers\Admin を作成します。
新規登録画面は作成しないので、RegisterController.php は削除して大丈夫です。
また、app\Http\Controllers\Admin 配下にあるファイルの namespace を全て変更しましょう。

namespace App\Http\Controllers\Auth; // 変更前

namespace App\Http\Controllers\Admin; // 変更後

それでは次に、Blade も用意しましょう。
resources\views\auth をコピーし、resources\views\admin を作成しましょう。
また、新規登録機能は今回作成しませんので、register.blade.php は削除してしまって大丈夫です。

それではルーティングを設定していきましょう。

web.php
// 略
// ログインしていない場合
Route::group(['prefix' => 'admin'], function () {
    Route::get('login', 'Admin\LoginController@showLoginForm')->name('admin.login');
    Route::post('login', 'Admin\LoginController@login');
});

それではここまできましたら、LoginController.php に上記で設定したメソッドを追加しましょう。

app\Http\Controllers\Admin\LoginController.php

// 略
public function __construct()
    {
        $this->middleware('guest:admin')->except('logout');
    }

    public function showLoginForm()
    {
        return view('admin.login');
    }

    protected function guard()
    {
        return Auth::guard('admin');
    }

ここまでで、http://localhost/admin/login にアクセスすることで、ログイン画面を表示することができるようになりました。

また、admin\login.blade.php が現状、user のログインフォームとなっていますので admin へと変更をしましょう。

admin\login.blade.php

// 略
<form method="POST" action="{{ route('login') }}"> // 変更前

<form method="POST" action="{{ route('admin.login') }}"> // 変更後

// 略

それでは次に、ログイン後に遷移する画面を作成していきましょう。
今回は仮で、Admin はログイン後に admin/home に遷移することにします。

それではまず、ログイン後のルーティングを設定します。

web.php
// 略

// ログイン後の場合
Route::group(['prefix' => 'admin', 'middleware' => 'auth:admin'], function () {
    Route::get('home', 'Admin\HomeController@index')->name('admin.home');
});

では HomeController.php を新規作成しましょう。
App\Http\Controllers\HomeController をコピーして新規作成します。

App\Http\Controllers\Admin\HomeController.php

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class HomeController extends Controller
{
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Contracts\Support\Renderable
     */
    public function index()
    {
        return view('admin.home');
    }
}
油そば

コピー元とほとんど一緒だな。
違うとすると、constructor がないくらいか。

そうです。web.php で middleware を設定しているため不要になっています。
それでは blade も作成していきましょう。

resources\views\admin\home.blade.php


@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">Admin Dashboard</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    You are logged in!
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

それでは、次にログイン後にリダイレクトされる画面を設定していきましょう。
それらの設定は RouteServiceProvider.php で行います。

app\Providers\RouteServiceProvider.php

// 略

// 変更前
/**
     * The path to the "home" route for your application.
     *
     * @var string
     */
    public const HOME = '/home';

// 変更後
/**
     * The path to the "threads" route for your application.
     *
     * @var string
     */
    public const HOME = '/threads';
    
    /**
     * The path to the "admin/home" route for your application.
     *
     * @var string
     */
    public const ADMIN = '/admin/home';

// 略

こちらで、変更しました。
現在、ユーザーがログインすると「/home」にリダイレクトされていました。
なので、「/threads」に変更し、ログイン後にすぐに掲示板に遷移できるよう変更しています。
また、Admin に関しては、「/admin/home」と先ほど作成した Blade ファイルにリダイレクトできるようにしています。

app\Http\Controllers\Admin\LoginController.php

// 略
/**
     * Where to redirect admins after login.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::ADMIN;
// 略
油そば

RouteServiceProvider::ADMIN; とすることで、先ほどの ‘/admin/home’ を使用しているのか。

ではここまでで、ログインからの画面遷移が可能になりましたので実際に確認してみましょう。
まずは、新しく実装した Admin から確認をしていきましょう。

http://localhost/admin/login にアクセス。

admin

先ほど Seed しているので、そちらでログインしましょう。

ログインできましたね

ログインでき、home.blade.php に遷移できました。
では次に、ユーザーで確認する為にログアウトしましょう。

ログアウトしたら、ユーザーのログイン画面にアクセスしましょう。
http://localhost/login

ろgログログ

ログインすると…….

掲示板に直接リダイレクトされるようになりました。

こちらを参考にいたしました。
https://pusher.com/tutorials/multiple-authentication-guards-laravel

11 章での変更点は以下からご確認いただけます。
https://github.com/t-aburasoba/thread-board/pull/9/files

もしこの記事をいいねと思ったたり、ご参考になりましたら下記ボタンからサポートしていただけますと、とても励みになります!




コメントを残す

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