Laravelのみでクイズアプリを作る方法②管理人が問題を作成する

Laravelのみでクイズアプリを作る方法②管理人が問題を作成する

439 回閲覧されました

みなさんこんにちは、jonioです。

前回の解説でクイズを作成して解答する事ができる様になりました。

今の段階では全てのログインユーザーが問題の作成と解答ができますが管理人だけが問題を作成できるのが普通だと思います。

だから管理人のみ問題を作成できる様にします。

知っておかないといけない知識

多対多リレーションを使いますが1対1リレーションと多対多リレーションを知っている状態じゃないと理解できないのでまずはそれを知って下さい。

多対多リレーションは↓です。

権限を付ける流れ

今回は特定のユーザーが管理者権限・ユーザー権限を持つ事ができてユーザー権限を全てのユーザーが持つ事ができるので多対多リレーションを使います。

ユーザーを登録しているテーブルがusersです。

権限を登録するテーブルをroles(後で作成します)とします。

まずはUserモデルとRoleモデルに多対多リレーションを使う為の記述をします。

usersテーブルとrolesテーブルのリレーション

まだ作成していないRoleモデルを作成します。

マイグレーションファイルに記述してカラムを作成します。

権限名を登録する為のnameカラムを作成します。

記述をしたら「sail php artisan migrate」をします。

それではリレーションの設定をしていきます。

リレーションの設定

User.phpとRole.phpに記述します。

User.phpを↓にします。

Role.phpを↓にします。

記述が終わったら次は中間テーブルを作成します。

中間テーブルの作成

ターミナルで↓のコマンドを叩きます。

そしてマイグレーションファイルに記述します。

記述が終わったら「sail php artisan migrate」をするとrole_userテーブルにuser_idとrole_idが作成されます。

phpMyAdminの編集

phpMyAdminは通常直接触りませんが設定の為に直接触ります。

開発環境にLaravel Sailを使っている場合はデフォルトで存在していないので↓を読んで実装して下さい。

phpMyAdminにアクセスしてrolesテーブル(↓の赤枠)をクリックして挿入(↓の青枠)をクリックします。

idカラムの値に1を入力してnameカラムの値にadminを入力して実行して下さい。

そしてidカラムの値に2を入力してnameカラムの値にuserを入力して実行して下さい。

するとrolesテーブルのカラムに値が入るのを確認できます。

次はrole_userテーブルを編集しますがアカウント登録しているユーザーが最低2人いないと管理者権限・ユーザー権限の確認ができないのでアカウントが2つある状態にして下さい。

role_userテーブルで挿入をクリックしてuser_id・role_idに1を入力して実行します。

同様にuser_id・role_idに2を入力して実行します。

するとrole_userテーブルが↓になります。

これでusersテーブルのid=1はrolesテーブルのadmin(管理者)になりid=2はrolesテーブルのuser(ユーザー)になります。

また新しくアカウントの登録をした場合権限をuserに設定します。

「Laravelのプロジェクト > app > Http > Controllers > Auth > RegisteredUserController.php」を修正します。

49行目より新しく登録したアカウントの権限がuserになります。

それでは権限に応じて表示の切り替えをします。

Gateの設定

管理者権限のみ↓の赤枠が表示される様にします。(管理人用のリンクからクイズの作成ができます)

「Laravelのプロジェクト > app > Providers > AuthServiceProvider.php」に記述します。

特定の人のみに表示する権限を与える為に「Gate」という物を使うのですが 9行目はその為の記述です。

権限を与える方法として「Gate」と「Policy」がありますがGateは手軽に権限を与える事ができるイメージです。

今回のアプリはデモなのでGateで実装します。

36行目〜43行目がGateを使う為の記述ですが書き方は↓です。

37行目の「$user->roles」ですがリレーションを使っています。

またforeachを使っていますが1人が管理者とユーザーの両方の権限を持つ可能性があるから全ての権限(管理者・ユーザー)を使える様にする為です。

37行目〜42行目よりrolesテーブルのnameカラムの値がadminの場合にGateが実行される様になります。

36行目でUserを使う為に10行目の記述があります。

コントローラーの設定

管理者のみが問題作成のページを開く事ができる様にする為にQuizController.phpを修正します。

30行目〜32行目のelseの前の「}」までがadminの権限がない場合に403(権限なし)のページが表示される様になります。

試しに管理者ではないアカウントでログインして「http://localhost/create」にアクセスすると↓の表示になります。

次はindex.blade.phpにおいて管理者ではない場合に管理者用のリンクが表示されない様にします。

index.blade.phpの修正

index.blade.phpを修正します。

21行目の「@can(‘Gate名’)」〜23行目の「@endcan」で挟むとGateを適用できます。

21行目の「admin」はAuthServiceProvider.phpの36行目の「Gate::define(admin’」のadminです。

これで管理者の場合に管理者用のリンクが表示されます。

これでひとまずアプリの完成です。

公開

レンタルサーバーにXSERVERを使ってサブドメインで公開する場合は下記の記事でできます。

次回の解説

次回はクイズの正解数のランキング表の作り方の解説をします。