Laravel adminを雑に触ってみたメモ
Laravel admin is 管理画面簡単に作れる君
laravel novaというこちらも管理画面作れる君を触ろうとしたけど
ライセンス1万かかるっていうから諦めて
似たようなの触ってみたという経緯
公式サイト
かなり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
にアクセスすると
コレくらい出来てるすごい
表示をいじる
表示をいじった結果変わった箇所は資格で囲ったところ
リレーション先の値を表示するようにする
コマンドを叩いて作られた初期状態だと 愚直にテーブルの中身を表示しているだけなので 外部キーはそのまま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ボックスに変更する
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のしがらみに囚われてイライラ...みたいなのはなさそう