前回の記事では、Laravel 5.5に対応したLaravel Admin Panelの紹介と基本的な使い方を紹介しました。
今回はLaravel Admin PanelのCRUD Generator機能を拡張し、プログラムを書かずに管理画面を構築することを目的として、より実用的なアプリケーションを作成しましたので紹介したいと思います。
CRUD Generatorの機能を知る
実用的にするには何が足りないか?を考えてみましょう。
CRUD Generatorのコマンドとしては、
php artisan crud:controller
php artisan crud:model
php artisan crud:migration
php artisan crud:view
もあり、それぞれ個別に作成することもできますが、Laravel Admin PanelのCRUD Generatorは、
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
済なので、以下のファイルをそのまま書き換えます。
/resources/views/vendor/laravel-admin/generator.blade.php
ページネーションとリレーション
「Table Fields:」より上にページネーションとリレーションを設定する項目を追加します。
<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の設定項目を追加します。
<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以外のバリデーションも設定できるように変更します。
変更前
<label>Required</label>
<select name="fields_required[]" class="form-control">
<option value="0">No</option>
<option value="1">Yes</option>
</select>
変更後
<label>Validation</label>
<input name="fields_validations[]" class="form-control" type="text" placeholder="required|min:6|max:255">
Controllerをカスタマイズする
ルートの変更
まずは、composer update
した際にファイルを上書きされないよう、パッケージのファイルをvendorからapp以下コピーしてカスタマイズします。
コピー元
/vendor/appzcoder/laravel-admin/src/Controllers/ProcessController.php
コピー先
/app/Http/Controllers/Admin/ProcessController.php
/routes/web.php
を変更して、コピー先のファイルへルートを設定します。
変更前
Route::get('admin/generator', ['uses' => 'AppzcoderLaravelAdminControllersProcessController@getGenerator']);
Route::post('admin/generator', ['uses' => 'AppzcoderLaravelAdminControllersProcessController@postGenerator']);
変更後
Route::get('admin/generator', 'AdminProcessController@getGenerator');
Route::post('admin/generator', 'AdminProcessController@postGenerator');
Namespaceの変更
当然ですが、ルートが変わったのでNamespaceも変更しておきます。
変更前
namespace AppzcoderLaravelAdminControllers;
変更後
namespace AppHttpControllersAdmin;
フィールドのをカスタマイズ
上記でコピーしたProcessController.php
をカスタマイズします。
39~47行目のforeach付近を以下のように書き換えます。
変更前
foreach ($request->fields as $field) {
if ($request->fields_required[$x] == 1) {
$validationsArray[] = $field;
} $fieldsArray[] = $field . '#' . $request->fields_type[$x]; $x++;
}
変更後
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行目の以下のように書き換えます。
変更前
if (!empty($validationsArray)) {
$commandArg['--validations'] = implode("#required;", $validationsArray) . "#required";
}
変更後
if (!empty($validationsArray)) {
$commandArg['--validations'] = implode(';', $validationsArray);
}
以上でバリデーションは完了です。
最後に、51~75行目付近に以下のコードを追加し、Indexを完成させてリレーションとページネーションを追加します。
追加するコード
if (!empty($indexesArray)) {
$commandArg['--indexes'] = implode(',', $indexesArray);
}if ($request->has('pagination')) {
$commandArg['--pagination'] = $request->pagination;
}if ($request->has('relationships')) {
$commandArg['--relationships'] = $request->relationships;
}
完成したのがこちらです。