前回の記事では、Laravel 5.5に対応したLaravel Admin Panelの紹介と基本的な使い方を紹介しました。
今回はLaravel Admin PanelのCRUD Generator機能を拡張し、プログラムを書かずに管理画面を構築することを目的として、より実用的なアプリケーションを作成しましたので紹介したいと思います。
CRUD Generatorの機能を知る
実用的にするには何が足りないか?を考えてみましょう。
CRUD Generatorのコマンドとしては、
1 2 3 4 5 |
php artisan crud:controller php artisan crud:model php artisan crud:migration php artisan crud:view |
もあり、それぞれ個別に作成することもできますが、Laravel Admin PanelのCRUD Generatorは、
1 |
php artisan crud:generate |
を利用し、上記すべてのファイル作成します。
crud:generate
コマンドのオプションは15個程ありますが、Laravel Admin Panelではその全てを使用していません。
例えば、バリデーションは必須(required)のみ、できればリレーションも設定したいですね。
追加した機能
- Pagination(ページネーション)
- 1ページの最大表示件数を設定します。
- Relationships(リレーション)
- テーブルの結合にJOINを使わずにモデルに利用するか設定します。
- Nullable(NULLの許可)
- NULLのデータを許可するかどうか設定します。
- Index(INDEXの利用)
- INDEXを利用するか設定します。
- Validation(バリデーション)
- 初期状態では必須(required)しか設定できなかったので、様々なバリデーションを利用できるようにしました。
Viewをカスタマイズする
viewはphp artisan vendor:publish
済なので、以下のファイルをそのまま書き換えます。
1 |
/resources/views/vendor/laravel-admin/generator.blade.php |
ページネーションとリレーション
「Table Fields:」より上にページネーションとリレーションを設定する項目を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<div class="form-group"> <label for="pagination" class="col-md-4 control-label">Pagination:</label> <div class="col-md-6"> <input type="number" name="pagination" class="form-control" id="pagination" placeholder="20"> </div> </div> <div class="form-group"> <label for="relationships" class="col-md-4 control-label">Relationships:</label> <div class="col-md-6"> <input type="text" name="relationships" class="form-control" id="relationships" placeholder="comments#hasMany#AppComment,posts#belongsTo#AppPost"> </div> </div> |
Table Fieldsの変更
Table Fields内に以下のNullable(Null許可)とIndexの設定項目を追加します。
1 2 3 4 5 6 7 8 9 10 11 |
<label>Nullable</label> <select name="fields_nullable[]" class="form-control"> <option value="0">No</option> <option value="1">Yes</option> </select> <label>Index</label> <select name="fields_index[]" class="form-control"> <option value="0">No</option> <option value="1">Yes</option> </select> |
また、初期状態だと「Required」という項目がありますが、これをrequired以外のバリデーションも設定できるように変更します。
変更前
1 2 3 4 5 6 |
<label>Required</label> <select name="fields_required[]" class="form-control"> <option value="0">No</option> <option value="1">Yes</option> </select> |
変更後
1 2 3 |
<label>Validation</label> <input name="fields_validations[]" class="form-control" type="text" placeholder="required|min:6|max:255"> |
Controllerをカスタマイズする
ルートの変更
まずは、composer update
した際にファイルを上書きされないよう、パッケージのファイルをvendorからapp以下コピーしてカスタマイズします。
コピー元
1 |
/vendor/appzcoder/laravel-admin/src/Controllers/ProcessController.php |
コピー先
1 |
/app/Http/Controllers/Admin/ProcessController.php |
/routes/web.php
を変更して、コピー先のファイルへルートを設定します。
変更前
1 2 3 |
Route::get('admin/generator', ['uses' => 'AppzcoderLaravelAdminControllersProcessController@getGenerator']); Route::post('admin/generator', ['uses' => 'AppzcoderLaravelAdminControllersProcessController@postGenerator']); |
変更後
1 2 3 |
Route::get('admin/generator', 'AdminProcessController@getGenerator'); Route::post('admin/generator', 'AdminProcessController@postGenerator'); |
Namespaceの変更
当然ですが、ルートが変わったのでNamespaceも変更しておきます。
変更前
1 2 |
namespace AppzcoderLaravelAdminControllers; |
変更後
1 2 |
namespace AppHttpControllersAdmin; |
フィールドのをカスタマイズ
上記でコピーしたProcessController.php
をカスタマイズします。
39~47行目のforeach付近を以下のように書き換えます。
変更前
1 2 3 4 5 6 |
foreach ($request->fields as $field) { if ($request->fields_required[$x] == 1) { $validationsArray[] = $field; } $fieldsArray[] = $field . '#' . $request->fields_type[$x]; $x++; } |
変更後
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
foreach ($request->fields as $field) { if ($request->fields_index[$x] == 1) { $indexesArray[] = $field; } if (!empty($request->fields_validations[$x])) { $validationsArray[] = $field . '#' . $request->fields_validations[$x]; } if ($request->fields_nullable[$x] == 1) { $fieldsArray[] = $field . '#' . $request->fields_type[$x] . '#' . 'nullable'; } else { $fieldsArray[] = $field . '#' . $request->fields_type[$x]; } $x++; } |
これで、Index、バリデーションの下準備とNullable設定が完了しました。
次に、52~54行目の以下のように書き換えます。
変更前
1 2 3 4 |
if (!empty($validationsArray)) { $commandArg['--validations'] = implode("#required;", $validationsArray) . "#required"; } |
変更後
1 2 3 4 |
if (!empty($validationsArray)) { $commandArg['--validations'] = implode(';', $validationsArray); } |
以上でバリデーションは完了です。
最後に、51~75行目付近に以下のコードを追加し、Indexを完成させてリレーションとページネーションを追加します。
追加するコード
1 2 3 4 5 6 7 8 |
if (!empty($indexesArray)) { $commandArg['--indexes'] = implode(',', $indexesArray); }if ($request->has('pagination')) { $commandArg['--pagination'] = $request->pagination; }if ($request->has('relationships')) { $commandArg['--relationships'] = $request->relationships; } |
完成したのがこちらです。
minoryorg/laravel-crud-admin: Laravel 5.5 + CRUD Generator + Admin Panel
コメント
コメント一覧 (1件)
[…] Laravel Admin PanelのCRUD Generatorをカスタマイズしてもっと実用的に!https://minory.org/crud-generator-custom.html前回の記事では、Laravel 5.5に対応したLaravel Admin Panelの紹介と基本的な使い方を紹介しま […]