Laravel8系でlaravel-adminを使ってみたメモ

# Laravel-adminとは
簡単に管理画面が構築できるライブラリです。
今回こちらのライブラリを使って簡単に管理画面を構築してみたので、使い方をまとめます。

# インストール
```bash
composer require encore/laravel-admin
php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
php artisan admin:install
``` 

これだけでインストールは完了です。簡単ですね。
あとはブラウザで```/admin```とアクセスすると管理画面のログイン画面が表示されます。![スクリーンショット 2021-05-25 9.47.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402204/dc2be4f5-e8ab-8777-61b7-f574c4de15b9.png)

## もしadmin_userを消してしまった場合
```migrate:fresh``` などをしてもしlaravel-adminで登録されたデータ全て初期化してしまったら、元に戻すのがめんどくさいのでSeederを作っておくのをお勧めします。

```php:/database/seeders/AdminTablesSeeder.php
<?php
namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Encore\Admin\Auth\Database\Administrator;
use Encore\Admin\Auth\Database\Role;
use Encore\Admin\Auth\Database\Permission;
use Encore\Admin\Auth\Database\Menu;
use Illuminate\Support\Facades\Hash;

class AdminTablesSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // create a user.
        Administrator::truncate();
        Administrator::create([
            'username' => 'admin',
            'password' => Hash::make('admin'),
            'name'     => 'Administrator',
        ]);

        // create a role.
        Role::truncate();
        Role::create([
            'name' => 'Administrator',
            'slug' => 'administrator',
        ]);

        // add role to user.
        Administrator::first()->roles()->save(Role::first());

        //create a permission
        Permission::truncate();
        Permission::insert([
            [
                'name'        => 'All permission',
                'slug'        => '*',
                'http_method' => '',
                'http_path'   => '*',
            ],
            [
                'name'        => 'Dashboard',
                'slug'        => 'dashboard',
                'http_method' => 'GET',
                'http_path'   => '/',
            ],
            [
                'name'        => 'Login',
                'slug'        => 'auth.login',
                'http_method' => '',
                'http_path'   => "/auth/login\r\n/auth/logout",
            ],
            [
                'name'        => 'User setting',
                'slug'        => 'auth.setting',
                'http_method' => 'GET,PUT',
                'http_path'   => '/auth/setting',
            ],
            [
                'name'        => 'Auth management',
                'slug'        => 'auth.management',
                'http_method' => '',
                'http_path'   => "/auth/roles\r\n/auth/permissions\r\n/auth/menu\r\n/auth/logs",
            ],
        ]);

        Role::first()->permissions()->save(Permission::first());

        // add default menus.
        Menu::truncate();
        Menu::insert([
            [
                'parent_id' => 0,
                'order'     => 1,
                'title'     => 'Dashboard',
                'icon'      => 'fa-bar-chart',
                'uri'       => '/',
            ],
            [
                'parent_id' => 0,
                'order'     => 2,
                'title'     => 'Admin',
                'icon'      => 'fa-tasks',
                'uri'       => '',
            ],
            [
                'parent_id' => 2,
                'order'     => 3,
                'title'     => 'Users',
                'icon'      => 'fa-users',
                'uri'       => 'auth/users',
            ],
            [
                'parent_id' => 2,
                'order'     => 4,
                'title'     => 'Roles',
                'icon'      => 'fa-user',
                'uri'       => 'auth/roles',
            ],
            [
                'parent_id' => 2,
                'order'     => 5,
                'title'     => 'Permission',
                'icon'      => 'fa-ban',
                'uri'       => 'auth/permissions',
            ],
            [
                'parent_id' => 2,
                'order'     => 6,
                'title'     => 'Menu',
                'icon'      => 'fa-bars',
                'uri'       => 'auth/menu',
            ],
            [
                'parent_id' => 2,
                'order'     => 7,
                'title'     => 'Operation log',
                'icon'      => 'fa-history',
                'uri'       => 'auth/logs',
            ],
        ]);

        // add role to menu.
        Menu::find(2)->roles()->save(Role::first());
    }
}
```

作成した```AdminTablesSeeder``` を ```DatabaseSeeder.php``` に追加する

```php:/database/seeders/DatabaseSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
            AdminTablesSeeder::class,
        ]);
    }
}

```
[こちら](https://qiita.com/ntm718/items/5ea29ee70b50320352c4)の記事を参考にしました。

# 管理画面用コントローラー作成
[ドキュメント](https://laravel-admin.org/docs/en/quick-start)では、

```bash
php artisan admin:make UserController --model=App\\User
```
こうなっていますが、Laravel8系からはモデルのディレクトリがapp/Modelsに変更になっているので、注意が必要です。
こんな感じで実行。

```bash
php artisan admin:make UserController --model=App\\Models\\User
```
あとは``` /app/Admin/routes.php```  にルーティングを追加する。

```php:/app/Admin/routes.php
<?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); // 追加

});

```

## 一覧
コントローラー作成を実行すると、```/app/Admin/Controllers/``` ディレクトリに作成したコントローラーが出来るのでそこを編集していくだけで管理画面が作成できます。
gridというのが一覧用になります。

```php:/app/Admin/Controllers/UserController.php
/**
 * 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;
}
```

## 少し応用的な使い方

### ステータスなどフラグ的なカラム
[display](https://laravel-admin.org/docs/en/model-grid-column-display)を使います。

```php
$grid->column('status','ステータス')->display(function () {
    $status = config('const.status');
    return $status[$this->status];
});
```

## 作成・変更
formというのが作成・変更用になります。

```php:/app/Admin/Controllers/UserController.php
/**
 * 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;
}
```

## バリデーション
基本的なよくあるLaravelのバリデーションルールを```rule```で追加していくだけ。
[バリデーション](https://laravel-admin.org/docs/en/model-form-validation)を参照

```php
$form->text('title')->rules('required|min:3');
```

## 少し応用的な使い方
### 作成後に一覧へ遷移
詳細は[コールバック](https://laravel-admin.org/docs/en/model-form-callback)参照

```php
$form->saved(function (Form $form) {
    return redirect('/admin/users');
});
```

## 初期設定を変更したい
```/app/Admin/bootstrap.php``` に共通の設定を書いていく。

```php:/app/Admin/bootstrap.php
<?php
~~省略~~
use Encore\Admin\Form;
use Encore\Admin\Grid;
Grid::init(function (Grid $grid) {
    // disabled
    $grid->actions(function ($actions) {
        $actions->disableView();
    });
    $grid->disableExport();
    $grid->disableColumnSelector();
});

Form::forget(['map', 'editor']);

Form::init(function (Form $form) {
    // disabled
    $form->tools(function (Form\Tools $tools) {
        $tools->disableView();
    });
    $form->footer(function ($footer) {
        $footer->disableViewCheck();
        $footer->disableEditingCheck();
        $footer->disableCreatingCheck();
    });
});
```

## 日本語化
[こちら](https://qiita.com/n-sawada-12345/items/471cc877d10d256bd5f4)の記事を参考にしました

```php:/config/app.php
//'timezone' => 'UTC',
'timezone' => 'Asia/Tokyo',

//'locale' => 'en',
'locale' => 'ja',
```

さらにlaravel-adminの日本語訳が気に入らなかったらこちらを修正。
```/resources/lang/ja/admin.php```