🙆‍♀️

Laravelで管理者が必要なら、マルチ認証でadminをつくるより簡単な方法あるよ

2023/04/23に公開

良くつくるパターンは、larave10 + breezeのマルチ認証で、userとadminを作成し、adminがuser管理をするサイト構成ですね。
まずbreezeをインストールした時点では、userの認証しかないので、ここでadmin用のものを作成する必要があります。
そして、admin用ができたら、adminのダッシュボードでuser管理用のページを別途作成するという手順になります。

Laravelにはlaravel-adminという無料のライブラリがあり、これを使用することで、breezeのadmin認証を作らずに、簡単にadminとadmin画面ができてしまいます。
複雑な処理を必要としない、user管理のadminであれば、こちらの方が楽でおススメです。
まずは、インストールしていきましょう。
作成環境は、Windows11、xampp、php8.1、VSCodeです。

laravel-admin の説明

laravel-adminわずか数行のコードで CRUD バックエンドを構築するのに役立つ laravel の管理インターフェースビルダーです。
laravel-admin

必要条件は下記の通り

  • php >= 7.0.0
  • Laravel >= 5.5.0
  • Fileinfo PHP Extension

Laravel5.5 からのものなので、長くつかわれる人気のものであることが分かります。
LaravelのAdmin管理画面といえば、公式のLaravel Novaも人気ですが、こちらは有料で、1プロジェクトごとに99ドル、Unlimitedで299ドルとなっています。
本格的なプロジェクトであれば視野に入れても良いかと思いますが、個人のテスト開発程度なら無料のものでよいと思っています。
laravel-adminは去年から更新は止まっていますが、こういった管理画面のテストや使用の練習に使用するには問題ないかと思います。
慣れたら、同じような機能を自身で作成するなり、内部を自身で直すなりしていけばよいのではないでしょうか。

laravelのインストール

まずは、プロジェクトの作成。Larabelインストールの方法です。Versionが変わっても一緒です。

適当なプロジェクト名をつけて、インストールしたいディレクトリにインストールしてください。Windowsとxamppを使用してるので、powerShellでhtdocsまできて、このコマンドを入れます。

composer create-project --prefer-dist laravel/laravel project-name

//laravelのバージョンを指定するなら,例:バージョン8
composer create-project --prefer-dist laravel/laravel project-name "8.*"

インストールが終わったら、config/app.phpの設定を変更します。

config.php
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
'faker_locale' => 'ja_JP',

DataBaseの設定をします。
このプロジェクトで使用するデータベースを作成して、自身のデータベース情報をenvに入力してください。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=DataBase Name
DB_USERNAME=DataBase User
DB_PASSWORD=DataBase Password

次にUser認証のためのBreezeを入れます。
composerで読み込む。

composer require laravel/breeze --dev

終ったらインストール。私はblade派なのでblade.
React や Vue にも対応しています。
blade の部分をreact か vue に変えてください。

php artisan breeze:install blade

インストールが終わったら、データベースのマイグレーションをします。
もしusersテーブルに対して既存のカラムに変更を入れたいときは、先に変更してください。
database > migrations のなかにテーブル情報があります。
*後からでもできますが、どういうテーブルができるのか先に確認してください。

php artisan migrate

データベーステーブルもできたのでnpm install & run devします。

npm intall
npm run dev

これでサーバーを立ち上げたらLaravel のインストールは終わりです。

php artisan serve

ストレージリンクの作成と、言語ファイルの作成

Laravelにはファイルストレージというパッケージがあり、「ディスク」というシステム単位で設定できます。各ディスクはストレージドライバとストレージで構成されます。
例えばlocalドライバはローカルに保存されているファイルを操作できます。
publicディスクは、公開アクセスできるファイルを保存する場所です。
通常storage/app/public に保存します。ここに保存されたファイルにWEBからアクセスするには、publicフォルダにあるstorageから、storage/app/public にシンボリックリンクを作成する必要があります。
次のコマンドでシンボリックリンクを作成します。

php artisan storage:link

これで、asset('storage/ファイルパス')でstorageに保存したファイルにアクセスできるようになりました。

細かい設定は下記で見れます。

Laravel 10.x ファイルストレージ

現在、登録画面はこうなっています。

デフォルト表示が英語です。これを日本語に直していきます。
Laravel10から、言語ファイルのlangフォルダが無くなりました。
多言語化が必要な場合は、artisanコマンドで作成する必要があります。

php artisan lang:publish

上記コマンド後、databaseフォルダの下にlangフォルダが作成されています。
中にはenフォルダがデフォルトで入っています。これをコピーしてjaにリネームします。
中のファイルを日本語翻訳します。
細かい言語設定は下記で見れます。

Laravel 10.x 多言語化

ここでできたlangフォルダの中にja.jsonを作成します。

{
  "Register": "登録",
  "Log in": "ログイン",
  "Password": "パスワード",
  "Email": "メールアドレス",
  "Forgot your password?": "パスワードをお忘れですか?",
  "Remember me": "パスワードを保存する",
  "Name": "名前",
  "Confirm Password": "パスワードの確認",
  "Already registered?": "登録済ですか?"
}

bladeのFormで使われてるログイン認証に必要なワードを登録しました。

ここで登録ページを改めて表示します。
日本語表示になりました。

テストで、1~2人ほど登録しておきます。

laravel-admin のインストール

Userの登録が済んだら、次はadminです。
composerを使います。
ターミナルに次のコマンドを入力してください。

composer require encore/laravel-admin

終ったら次にこれを入力します。

php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"

最後にインストール

php artisan admin:install

これでlaravel-adminがインストールされました。
サイトURL/admin でログイン画面が開きます。

一番最初は、ユーザー名:admin、パスワード:admin でログイン可能です。
早速ログインします。

上記のようなダッシュボードが表示されます。
左がメニュー、右上にログインユーザーが表示されています。

ログイン情報を変更します。
右上のAdministatorをクリックし、表示される設定ボタンをクリックします。

設定画面になります。
表示名とかアバター、パスワードを変更できそうなので、変更して送信を押します。
*ユーザーIDは不可。変えたいときは、直接DataBase のadmin_usersテーブルの情報を変更します。


送信したら、エラーが出ました。

ディスク [admin] が構成されていません。「config/filesystems.php」にディスク構成を追加してください。といった意味になります。
説明通りに、config/filesystems.php を開き、public の下に admin を追加したいと思います。

filesystems.php
        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
            'throw' => false,
        ],

        'admin' => [
            'driver' => 'local',
            'root' => storage_path('app/public/admin'),
            'url' => env('APP_URL').'/storage/admin',
            'visibility' => 'public',
            'throw' => false,
        ],

publicと似た構成にしてますが、まねることは無いです。好きに指定してください。
ただ、adminで使う公開ファイルなので、storageフォルダのpublic内で、公開フォルダはpublicディスクと同じく、storageフォルダ内にしておくのが無難かと思います。
指定した場所にフォルダも作成してください。

storage > app > public > admin

もう一度先ほどのユーザー設定を再試行します。

問題なく設定変更できました。

ログインしなおすと、右上のアイコンも変わっています。

管理画面にUser管理を追加する

現在、laravel-admin のメニューには、ダッシュボードとAdmin しかありません。
Userの管理をしたいので、User管理を追加したいと思います。

laravel-admin に追加変更をいれるには、app\admin の中で行います。
本体は、vender\encore の中です。
メニューを増やすときは以下のように行います。

  • app\Admin\Controllers にコントローラーを追加する
  • app\Admin\routes.php に情報を追加する
  • laravel-admin の管理画面 Admin メニューの中の menuでコントローラ情報を追加する

上記の手順になります。

Controller を作成する

早速、artisanコマンドで、コントローラを追加します。

php artisan admin:make UserController --model=App\Models\User

黄色の文字で、routeを追加してねと書いてありますが、まずControllerを確認します。

UserController.php
<?php

namespace App\Admin\Controllers;

use App\Models\User;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Show;

class UserController extends AdminController
{
    /**
     * Title for current resource.
     *
     * @var string
     */
    protected $title = 'User';

    /**
     * Make a grid builder.
     *
     * @return Grid
     */
    protected function grid()
    {
        $grid = new Grid(new User());

        $grid->column('id', __('Id'));
        $grid->column('name', __('Name'));
        $grid->column('email', __('Email'));
        $grid->column('email_verified_at', __('Email verified at'));
        $grid->column('password', __('Password'));
        $grid->column('remember_token', __('Remember token'));
        $grid->column('created_at', __('Created at'));
        $grid->column('updated_at', __('Updated at'));

        return $grid;
    }

    /**
     * Make a show builder.
     *
     * @param mixed $id
     * @return Show
     */
    protected function detail($id)
    {
        $show = new Show(User::findOrFail($id));

        $show->field('id', __('Id'));
        $show->field('name', __('Name'));
        $show->field('email', __('Email'));
        $show->field('email_verified_at', __('Email verified at'));
        $show->field('password', __('Password'));
        $show->field('remember_token', __('Remember token'));
        $show->field('created_at', __('Created at'));
        $show->field('updated_at', __('Updated at'));

        return $show;
    }

    /**
     * Make a form builder.
     *
     * @return Form
     */
    protected function form()
    {
        $form = new Form(new User());

        $form->text('name', __('Name'));
        $form->email('email', __('Email'));
        $form->datetime('email_verified_at', __('Email verified at'))->default(date('Y-m-d H:i:s'));
        $form->password('password', __('Password'));
        $form->text('remember_token', __('Remember token'));

        return $form;
    }
}

なーんにも書かなくても作りこんであります(笑)
このまま使えます。
gridで一覧の時の読み込み構成、detailで個別表示の設定、formで新規作成の構成となります。

routes.php に情報を追加する

次は、routes.php に追加します。
Laravel同様にrouteを指定します。
ここから追加の部分にresourcesで、URLとコントローラ名を記入します。

routes.php
<?php

use Illuminate\Routing\Router;
use Encore\Admin\Facades\Admin;
use App\Admin\Controllers\UserController;//追加

Admin::routes();

Route::group([
    'prefix'        => config('admin.route.prefix'),
    'namespace'     => config('admin.route.namespace'),
    'middleware'    => config('admin.route.middleware'),
    'as'            => config('admin.route.prefix') . '.',
], function (Router $router) {

    $router->get('/', 'HomeController@index')->name('home');

    //ここから追加
    $router->resources([
        'users' => UserController::class,
    ]);

});

これで設定は終わりです。次は管理画面での設定です。

laravel-admin 管理画面でメニューを増やす

管理画面左にメニュー一覧があります。
ダッシュボードと書かれた下に、Adminとあります。
その中のMenuをクリックします。

親IDは作りたいメニューの親。
タイトルはメニュー名。
アイコンは好きなものを。
URIは、routes.phpに設定したURI。
役割・権限は、用途に合わせて設定します。

これで左メニューの中にUserが表示されるようになりました。

クリックすると作成したユーザーが表示されています。

操作で、表示・編集・削除が可能です。新規ボタンで新規作成も可能です。



メニューを増やしたいときは、上記の操作を繰り返すだけです。
簡単な操作でここまでの画面を作成してくれるので、管理画面を手軽に作りたいときはおススメです。
また、管理画面の構成の学習にも役立つと思います。

Discussion