Laravel6にlaravel-aminで管理画面だけ作成

## 何を実現するか

ユーザー向けのサービスは別の言語でフロントエンド-バックエンド分けて作っている状況で、管理画面だけサクッと作り直しと言うか作る機会があったので、今更RailsAdminもあれなので新しいLaravel6でやってみることにしました。
サービスサイドと管理画面をオールインワンにするわけではないので、ドキュメントルート/に管理画面を持ってくるところまでサクッと手順を残します。

## 環境

- PHP 7.2
- Laravel 6.3

## インストールからマイグレーションまで
新規作成からlaravel-adminをインストールする。入れてみたら普通に動いたので特に利用に問題はないと思われます。

```shell
laravel new
composer require encore/laravel-admin
php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
php artisan admin:install
```

管理画面だけ作成するので勝手に入ったUser周りのファイルを削除してからマイグレーションへ。

```shell
rm database/migrations/2014_10_12_000000_create_users_table.php
rm database/migrations/2014_10_12_100000_create_password_resets_table.php
rm app/User.php
```
データベース接続は作成

```conf:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=13306
DB_DATABASE=hoge
DB_USERNAME=root
DB_PASSWORD=hoge
```

マイグレーション実行

```shell
php artisan migrate
```

## laravel-adminでモデルからコントローラーを作成する

モデルとコントローラーを作成する。コントローラーはadmin:makeでモデルを元に作成するので注意が必要。エンティティって呼ぶことの方が多いのでモデルって言うと自分の中で違和感が半端ない。

```shell
php artisan make:model Models\\Staff
php artisan admin:make StaffController --model=App\\Models\\Staff
```

コントローラーを作ると結果表示でルーティングに追加する行が表示されるので追加する

```
App\Admin\Controllers\StaffController created successfully.

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

    $router->resource('staffs',StaffController::class);
```

app/Admin/route.phpの方に追加するので注意。

```php:app/Admin/route.php
...
    $router->resource('staffs',StaffController::class);
...
```

## ルーティングと設定の変更

変更するファイルは下記の通り

- config/admin.php -> 14行目のnameと25行目のlogoだけ変えればいい
- routes/web.php -> /のルーティングを消す
- .env -> ADMIN_ROUTE_PREFIXを追加

.envにADMIN_ROUTE_PREFIXを/で追加すればドキュメントルートがadminになる。一番最後に追加すれば良い。

```config:.env
...
ADMIN_ROUTE_PREFIX=/
```

## シーダーを作成してメニュー追加

```
php artisan make:seeder MenuSeeder
```

laravel-adminのメニューはmysqlのadmin_menuテーブルに格納されているので、今入っているものを確認。

```sql
mysql> select * from admin_menu;
+----+-----------+-------+---------------+--------------+------------------+------------+------------+------------+
| id | parent_id | order | title         | icon         | uri              | permission | created_at | updated_at |
+----+-----------+-------+---------------+--------------+------------------+------------+------------+------------+
|  1 |         0 |     1 | Dashboard     | fa-bar-chart | /                | NULL       | NULL       | NULL       |
|  2 |         0 |     2 | Admin         | fa-tasks     |                  | NULL       | NULL       | NULL       |
|  3 |         2 |     3 | Users         | fa-users     | auth/users       | NULL       | NULL       | NULL       |
|  4 |         2 |     4 | Roles         | fa-user      | auth/roles       | NULL       | NULL       | NULL       |
|  5 |         2 |     5 | Permission    | fa-ban       | auth/permissions | NULL       | NULL       | NULL       |
|  6 |         2 |     6 | Menu          | fa-bars      | auth/menu        | NULL       | NULL       | NULL       |
|  7 |         2 |     7 | Operation log | fa-history   | auth/logs        | NULL       | NULL       | NULL       |
```

parent_id,order,title,icon,uriでレコードを作って追加すれば良いようなので、Seederに下記のように追記。これはユーザー管理を行う場合の例。
idがauto_incrementなのでparent_idの部分をもう少しちゃんとやりたいなら、一度全部削除して入れ直せるようにSeederを書いた方が良いので、すでに入っているレコードも記入した方が良いと思われます。

以下はUsersと言うメニューを追加する例。

```php:database/seeders/MenuSeeder.php
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
        DB::table('admin_menu')->insert([
            [
                "parent_id" => 0,
                "order"     => 8,
                "title"     => "Users",
                "icon"      => "fa-users",
                "uri"       => ""
            ],
            [
                "parent_id" => 8,
                "order"     => 9,
                "title"     => "Users",
                "icon"      => "fa-users",
                "uri"       => "users"
            ],

```

これで起動すればトップページにアクセスするとめでたく管理画面のログインページにリダイレクトされ、みることができるようになります。

```
php artisan serve
```

基本CRUDだけでなくリレーションとかも色々できるようなのですが記事はまた次回。