小規模プロジェクトの場合、フロント画面しか必要ないようなプロジェクトもある(あるよね?)

そんな時、実装していない機能なんかはDBを直接操作したり、phpMyAdminとかを管理画面代わりに使ったりするケースもある(あるよね?)

でもlaravelにはlaravel adminがある。

https://laravel-admin.org/docs/en/

簡単に言うと、管理画面を自動で実装してくれるツール。

LaravelのModelの定義とかを見て、例えばroleのカラムはプルダウンで選択肢から選んだりできるのでphpMyAdminよりは遥かに便利な管理画面となる。

管理画面からGUIで管理メニュー自体を新たに作ることもできる。

本記事は、これを実装する手順の備忘録である。

Laravelを使ったプロジェクトの作成は以前の記事を参照するべきである。

Laravel Adminもコマンドで導入

sailでlaravelプロジェクトを作った場合はこんな感じで導入。

sail composer require encore/laravel-admin

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

sail artisan admin:install

インストールが無事に完了すれば、http://localhost/admin/ にアクセスするとログイン画面がでる。

2020年12月現在、Laravel Adminの推奨環境がLaravel 5.5。

今構築した環境がLaravel 8でPHP7.4、MySQLは5という状態なので推奨環境とは程遠い状態なので動くか不安だったけど動いたでござる。

このままだと管理者がいないので、ログインできないよねと思ったけど、適当にadmin/adminと入力したらログインできた。

ところどころエラーが出ているみたいだけど、動く部分だけで動作するようになってるみたい。

柔軟で素晴らしい考えだと思う。

初期状態だと管理ユーザーを管理する画面が実装されている。

artisanにadminコマンドが追加されている。

管理画面で使うファイルはこのコマンドから作ることになる。

$ sail artisan admin

略
                                                                          
Laravel-admin version 1.8.14

Available commands:
 admin:make             Make admin controller
 admin:controller       Make admin controller from giving model
 admin:menu             Show the admin menu
 admin:install          Install the admin package
 admin:publish          re-publish laravel-admin's assets, configuration, language and migration files. If you want overwrite the existing files, you can add the `--force` option
 admin:uninstall        Uninstall the admin package
 admin:import           Import a Laravel-admin extension
 admin:create-user      Create a admin user
 admin:reset-password   Reset password for a specific admin user
 admin:extend           Build a Laravel-admin extension
 admin:export-seed      Export seed a Laravel-admin database tables menu, roles and permissions
 admin:minify           Minify the CSS and JS
 admin:form             Make admin form widget
 admin:permissions      generate admin permission base on table name
 admin:action           Make a admin action
 admin:generate-menu    Generate menu items based on registered routes.
 admin:config           Compare the difference between the admin config file and the original

一般ユーザーを管理する機能を追加

どんなサービスでもほぼ確実に実装するであろう会員管理の機能をLaravel Adminで実装してみよう。

最初からあるUserモデルを扱うコントローラーをartisanで作成。

ドキュメントでは、

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

こうなっていますが、Laravel8系からはモデルのディレクトリがapp/Modelsに変更になっているので注意。

※ 参考サイト

https://qiita.com/Dev-kenta/items/25ac692befe6f26f11cf


sailということも考慮してこんな感じで実行するのがいいのかな

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

実行すると色々メッセージがでるので言われるとおりに/app/Admin/routes.php に変更を加えよう

App\Admin\Controllers\UserController created successfully.

Add the following route to app/Admin/routes.php:

    $router->resource('users', UserController::class);
<?php

use Illuminate\Routing\Router;

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->resource('users', UserController::class);

});

この状態で管理画面をみる

http://localhost/admin/users

にアクセスするとこんな感じ。

Laravel Breezeの動作確認用に追加したユーザーがちゃんと編集とかできるようになってる。

管理画面からメニューリンクを追加

このままだとURLを直接入力しないとページが表示されないので不便。

管理メニューのmenuのリンクから、http://localhost/admin/auth/menu を開いて以下のようにメニュー自体を追加しよう。

URIはadmin以降のURLを入力(今回はusers)。

その他は適当でOK。色々いじるといいでしょう。

メニュー追加後は、画面の再読み込みとかをしないと反映されないので注意。

ちょっとカスタマイズしてみる

Userの管理画面自体は最低限できているけどこのままだと結構不便なので、UserController.phpを最低限修正しよう。

一覧画面ではパスワードの項目自体非表示に

grid()で一覧表示の項目を変更できる。今回はパスワードとremember_tokenの項目をコメントアウトして対応。

    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;
    }

編集時、パスワード項目は変更できないように

form()が追加・編集時のフォームの決め事。ここもコメントアウトして対応。

    /**
     * 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;
    }

まとめ

CRUDの基本操作だけで済むならLaravelAdminは超便利ツール。

ただ、枠から外れた操作を実装する場合は、逆にめんどくさいこともあるかも。

GUIでメニュー増やせるのはいいけど、逆にGUIじゃないとメニューすら増やせない(できるかもしれんけど大変)ので、一長一短。

小規模プロジェクトならLaravelAdmin、そうじゃないなら独自で管理画面を作るのがいいと思う。