ぬぬん!

やってみたこと,思ったこと

Laravel adminを雑に触ってみたメモ

Laravel admin is 管理画面簡単に作れる君

laravel novaというこちらも管理画面作れる君を触ろうとしたけど
ライセンス1万かかるっていうから諦めて
似たようなの触ってみたという経緯

公式サイト

Laravel-admin

かなりdocumentは充実している気がする

基本的に提供されていること

  • ControllerでのCRUD処理
  • 管理画面用のルーティング
  • フォームやテーブルに使う値の整形
  • フォームやテーブルのテンプレート
  • 管理画面に入れるユーザの管理処理
  • 管理画面上のメニューのカスタマイズ

雑に作ってみる

よくありがちな記事投稿管理画面を作る
テーブルは以下2つを用意して
Modelも作ってリレーションも張っておく

  • category
    • id
    • name
  • posts (記事)
    • id
    • title
    • content
    • category_id

公式のinstallationの手順を済ませておく( http://laravel-admin.org/docs/#/en/installation )

ControllerでのCRUD処理

laravel-adminが提供しているartisanコマンドを叩く

modelオプションに管理画面を作りたいmodelを渡す

php artisan admin:make PostController --model=App\\Post

すると、index() show() edit() create()CRUDの基本形のメソッドに加え
フォームや一覧に表示する値の整形メソッド grid() detail() form() が備わった
app/Admin/Controllers/PostController.php が作成させる

メソッド内の処理も記述済みのため
実質、管理画面の処理8割がコマンド一つで完成する

管理画面用のルーティング

公式のinstallationの手順を行った時点で作成されたAdmin/routes.php
先程作ったControllerのルーティングを追加する

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

    $router->get('/', 'HomeController@index');
    $router->resource('/posts', PostController::class); // 追加

});

これで/admin/postsにアクセスすると
f:id:gomayumax:20181007151519p:plain コレくらい出来てるすごい

表示をいじる

表示をいじった結果変わった箇所は資格で囲ったところ

f:id:gomayumax:20181007151545p:plain

リレーション先の値を表示するようにする

コマンドを叩いて作られた初期状態だと 愚直にテーブルの中身を表示しているだけなので 外部キーはそのままIDで表示されていたりする(ここではcategory_id) それはカッコが悪いのでちゃんと名前を表示してあげよう

    protected function grid()
    {
        $grid = new Grid(new Post);

        $grid->id('Id');
        $grid->title('Title');
        $grid->content();
//        $grid->category_id('category id'); 
        $grid->category()->name('category');  // 変更
        $grid->created_at('Created at');
        $grid->updated_at('Updated at');

        return $grid;
    }

リレーションで定義したメソッド名とそのリレーション先のカラム名を指定してあげるといい感じになる(1対1の場合)

1対多の場合は、pluck()で表示したい値の配列を整形したものを渡してあげるといい
( 参考; https://github.com/z-song/demo.laravel-admin.org/blob/master/app/Admin/Controllers/PostController.php#L152 )

省略して表示するようにする

今回だと記事の本文がクソ長いのでテーブルの幅を取ってるのが気になる...
なので頭10文字だけ表示させたい

その時はlimit()が使える

    protected function grid()
    {
        $grid = new Grid(new Post);

        $grid->id('Id');
        $grid->title('Title');
//        $grid->content();
        $grid->content()->limit(10);  // 変更
        $grid->category()->name('category');
        $grid->created_at('Created at');
        $grid->updated_at('Updated at');

        return $grid;
    }

表示される値の整形ついてはIlluminate\Support\Strのメソッドが使えるので結構柔軟にいろいろできそう

String operations If the current output data is a string, you can call the method of class Illuminate\Support\Str.

laravel-admin/model-grid-column.md at master · z-song/laravel-admin · GitHub

selectボックスにする

記事新規作成/編集画面におけるフォームについて

初期状態だとコレも一覧画面のとき同様カテゴリIDが表示された状態になっている なんのカテゴリかわからないのでselectボックスに変更する

f:id:gomayumax:20181007151533p:plainf:id:gomayumax:20181007151540p:plain
use App\Category; // 追加

class PostController extends Controller
{
    protected function form()
    {
        $form = new Form(new Post);

        $form->text('title', 'Title');
        $form->textarea('content', 'Content');
//        $form->text('category_id', 'Category id');
        $form->select('category_id', 'Category')->options(Category::all()->pluck('name', 'id'))->value(1); // 変更

        return $form;
    }
}

select()に変更しoptions() に配列でoptionsの値を渡してあげれば完成

参考; laravel-admin/model-form-fields.md at master · z-song/laravel-admin · GitHub

所感

雑に記事投稿の管理画面を作ってみたわけだけど、確かに簡単、はやい、全然コード書いてない。 だけど、与えられたフォームじゃ嫌だな〜とか、CRUDとすこし逸れた処理系を追加したいとか(例えば記事公開ボタン)
発生した時点で、与えられたフォームで賄うのはとてつもなく苦しくなると思う

CRUD系の表示や挙動については本当に本当に簡単で基本的なことしかしないと決まっているのならlaravel-adminでいいかなーと思った

込み入ったことするなら、laravel-admin の管理者管理のところだけ使って、あとはControllerからviewまでフル実装でいいかなという感想だ

人は欲深いので、そのうちかっこいいフォームとかほしいとか言いだす
そうなるとVue.jsなりで実装したほうが、laravel-admiのしがらみに囚われてイライラ...みたいなのはなさそう