Laravel-admin実装時メモ

今更ですが、初めてLaravel-adminを使ってみたので、その時のメモです。

# 前提

php 7.1
Laravel 5.5

# インストール

[こちら](http://laravel-admin.org/docs/#/en/installation)の通りにインストールすればOKです。

# ログインしてみる

1. ドメイン(`http://localhost`等)/adminにアクセス
1. admin/adminでログイン

# CRUDを実装

1. Controller

    [こちら](http://laravel-admin.org/docs/#/en/quick-start?id=add-controller)をそのまま使いました。

1. route

    [こちら](http://laravel-admin.org/docs/#/en/quick-start?id=add-route)を参考にresourcesを使いました。

    ```php:Userモデル用のroute
    $router->resource('users', UserController::class);
    ```

    `UserController::class` はapp/Admin/routes.phpで名前空間を指定していないのでIDE等で指摘されると思いますが、

    ```php:app/Admin/routes.php
    Route::group([
        'prefix'        => config('admin.route.prefix'),
        'namespace'     => config('admin.route.namespace'), // ここで名前空間を指定
        'middleware'    => config('admin.route.middleware'),
    ```

    ```php:app/config/admin.php
        'route' => [

            'prefix' => 'admin',

            'namespace' => 'App\\Admin\\Controllers', // 実際に指定している名前空間はこちら

            'middleware' => ['web', 'admin'],
        ],
    ```

    が最初から入っているので、　routes.php内で `use App\Admin\Controllers`　を定義する必要はありません。

1. メニュー

    [こちら](http://laravel-admin.org/docs/#/en/quick-start?id=add-left-menu-item)にあるURLに直接アクセスするか、

    <img width="256" alt="スクリーンショット 2018-06-23 17.01.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/173370/916af823-f14f-656c-9f8f-8cd1f626496d.png">

    ここからアクセスしてGUIで設定します。

1. 確認してみる

    上記メニュー追加でUsersが追加されているのでアクセスしてみます。

    ![スクリーンショット 2018-06-23 20.09.31.png](https://qiita-image-store.s3.amazonaws.com/0/173370/290edb06-2132-1747-a2d8-2a0058a456be.png)

    一覧画面が表示されます。

1. ヘッダー、説明、表示項目、フィルターを設定する

    まずは画面上にヘッダーと説明を編集します。(他のページも同様です)

    ```php:app/Admin/UserController.php
    public function index()
    {
        return Admin::content(function (Content $content) {

            $content->header('ユーザー管理');
            $content->description('登録されているユーザーの一覧です。');

            $content->body($this->grid());
        });
    }
    ```

    次に、一覧に表示する項目を追加します。
    (その他のオプションは[こちら](http://laravel-admin.org/docs/#/en/model-grid)の通り)

    ```php:app/Admin/UserController.php
    protected function grid()
    {
        return Admin::grid(User::class, function (Grid $grid) {

            $grid->id('ID')->sortable();
            // 表示項目を追加
            $grid->column('name', '氏名');
            $grid->column('email', 'メールアドレス');
            $grid->column('department.name', '部署名'); // リレーションを貼っていればUserモデルと同じように取得出来ます

            $grid->created_at();
            $grid->updated_at();

            // フィルターを追加
            $grid->filter(function($filter){
                $filter->like('name', '氏名');
                $filter->like('email', 'メールアドレス');
                $filter->like('department.name', '部署名');
            });
        });
    }
    ```

    再度画面にアクセスすると、表示項目、フィルターが追加されています。

6. 編集出来る項目を追加する

    編集画面はデフォルトでid、created_at, updated_atのみが表示されており、編集可能な項目がないので追加します。
    (その他のオプションは[こちら](http://laravel-admin.org/docs/#/en/model-form)の通り)

    ```php:app/Admin/UserController.php
    protected function form()
    {
        return Admin::form(User::class, function (Form $form) {

            $form->display('id', 'ID');

            // 氏名とメールアドレスはテキストボックスとして編集項目に追加
            $form->text('name', '氏名');
            $form->text('email', 'メールアドレス');

            // 所属部署はDepartmentモデルから[[id => name]...]の値を取得し、selectボックスとして追加
            $form->select('department_id', '所属部署')->options(
                Department::pluck('name', 'id')
            );

            $form->display('created_at', 'Created At');
            $form->display('updated_at', 'Updated At');
        });
    }
    ```

    編集画面にアクセスすると、編集可能な項目が追加されていることがわかります。

# 別環境に適用する

実装はドキュメントを読みはじめてから実装完了まで１時間弱という爆速で終わったので早速本番環境にも！と思ったのですが、こちらでちょっと躓いたので、ここも残します。

1. ソースコードを適用してcompose installする

    git pullなり何なりで最新化します。
    install時に行った

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

    はおそらくgitで管理していると思うので不要です。

2. (必要であれば)Seederからデータを流し込む

    本番等で１からデータを整備する場合は微妙ですが、別のローカルで構築する際は入れておいたほうが良いと思います。
    `php artisan admin:install` の中で行われているのですが、すでにapp/Adminが出来上がっているとエラーを吐くのでSeederだけを個別に実行するのが良いかなと思います。
    実行するSeederは[こちら](https://github.com/z-song/laravel-admin/blob/master/src/Console/InstallCommand.php#L53)

3. (こちらも必要であれば)HTTPS化する

    Laravel-adminはデフォルトでHTTPS化されていないので、必要であればHTTPSでアクセスするようにします。
    変更する箇所は

    ```php:config/admin.php
    /*
     * Use `https`.
     */
    // TrueであればHTTPSでアクセスされるようになるので、環境に応じて変更して下さい
    'secure' => (env('APP_ENV', 'local') === 'production'),
    ```

    です。

4. (さらにこちらも必要であれば)ページネーションもHTTPSにする

    3.でHTTPS化しても、ページネーションは個別に対応してあげる必要があります。
    いくつか方法はあると思いますが、今回は

    ```php:app/Providers/AppServiceProvider.php
    public function boot()
    {
        // 本番のみページネーションで生成されるURLをHTTPSにする
        if (config('app.env') === 'production') {
            $this->app['request']->server->set('HTTPS','on');
        }
    }
    ```

    で対応しました。

# さいごに

ドキュメントに丁寧に書かれているので、きちんと読めばこの記事を見る必要は全くありませんが、もし詰まるような方がいた時に少しでも役に立てれば幸いです。