Laravel Admin PanelのCRUD Generatorをカスタマイズしてもっと実用的に!

crud-generator-custom

前回の記事では、Laravel 5.5に対応したLaravel Admin Panelの紹介と基本的な使い方を紹介しました。
今回はLaravel Admin PanelCRUD Generator機能を拡張し、プログラムを書かずに管理画面を構築することを目的として、より実用的なアプリケーションを作成しましたので紹介したいと思います。

CRUD Generatorの機能を知る

実用的にするには何が足りないか?を考えてみましょう。
CRUD Generatorコマンドとしては、

php artisan crud:controller
php artisan crud:model
php artisan crud:migration
php artisan crud:view

もあり、それぞれ個別に作成することもできますが、Laravel Admin PanelCRUD 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;
}

完成したのがこちらです。

カスタマイズ後

他にも使えるコマンドもあるし、テンプレートを切り替えたり、修正や削除にも対応したいので、まだまだ改造する余地はあります。


Amazonベストセラー