Laravel-generator 程式碼生成包

Hogen發表於2020-09-26

github.com/HogenYuan/laravel-gener...

Introduction

由於最近在做後臺,需要類似於Gii的程式碼生成包,網上可能有比較豐富的包,不過沒怎麼去了解過,就根據自己習慣隨手寫了個方便自己使用的包,寫的比較匆忙所以程式碼可能比較粗糙。目前只寫了後端的,前端有時間在寫。

1. 根據自定義框架目錄,修改*.stub生成自定義的初始程式碼

2. 支援model + filter + request + resource + service + controller + migration + test

3. 自動讀取同名資料表並填充到 model + resource + migration 的欄位


Installation

composer require hogen\laravel-generator

php artisan vendor:publish --tag=generator
  • config/app.php

'providers' => [

    ···

    App\Console\Commands\Generator\GeneratorServiceProvider::class

];

Run

  • 請先根據自己的框架目錄和程式碼格式修改預設程式碼格式stub檔案

## name : 必填,短橫式命名的資源名稱}

## --module= : 必填,指定三級模組(大小寫規範) 如:GasStation/MainCard/Balance

## --prefix= : 指定二級字首(大小寫規範) 預設:AdminApi

## --baseDir= : 指定一級目錄(大小寫規範) 預設:Http

## --force : 覆蓋已存在檔案

## --filter : 使用filter篩選類

## --test : 生成測試檔案

例子:

//有大小寫規範

* Path: App\Http\Controller\AdminApi\User\Example 

php artisan admin:make-resource testExample --force --baseDir=Http --prefix=AdminApi --module=User\Example

* Path: App\Admin\Controller\User\Example

php artisan admin:make-resource testExample --force --filter --baseDir=Admin  --module=User\Example

Deployment自定義配置

Generator\MakeResource.php


protected $types = [

    'model', 'request', 'resource', 'service', 'controller', 'test', 'migration'

];
  • 選擇需要生成的元件,filter和test預設不開啟

  • 有先後順序之分,需按照上圖順序填寫


目錄規則

protected $pathFormat = [

    'model'      => ['inBaseDir' => false, 'prefix' => ''],

    'service'    => ['inBaseDir' => false, 'prefix' => ''],

    'test'       => ['inBaseDir' => false, 'prefix' => true],

    'request'    => ['inBaseDir' => true, 'prefix' => true],

    'resource'   => ['inBaseDir' => true, 'prefix' => true],

    'controller' => ['inBaseDir' => true, 'prefix' => true],

    'migration'  => ['inBaseDir' => false, 'prefix' => ''],

];
  • 在此修改各模組的路徑規則設定,會影響各檔案的名稱空間和類名

  • inBaseDir決定是否在BaseDir內,預設Http

  • prefix決定是否在二級字首內


Filter篩選器

protected $createFilter = false;

protected $baseFilterHelperPath = "Models\Traits\Filter";
  • 預設不開啟

  • 生成的filter基類的路徑 例: App/Models/Traits/Filter.php

  • 路徑生成只遵循$pathFormat中model的inBaseDir規則,不遵循prefix,避免個trait的生成


資料庫欄位填充

/**

 * 手動配置

 * resource檔案中不需要新增到 $fillable 的欄位

 *

 * @var string[]

 */

protected $resourceNoFillableFields = [

    'update_time',

    'updated_time',

    'delete_time',

    'deleted_time',

];

/**

 * 手動配置

 * model檔案中不需要新增到 $fillable 的欄位

 *

 * @var string[]

 */

protected $modelNoFillableFields = [

    'id',

    'create_time',

    'created_time',

    'update_time',

    'updated_time',

    'delete_time',

    'deleted_time',

];

Code Format 修改預設程式碼格式

  • 參考各stub配置自定義預設格式

  • 以下stub為簡化後的程式碼習慣,按需修改

Generator\stubs\*.stub


<?php

namespace DummyNamespace;

use NamespacedDummyModel;

use NamespacedDummyRequest;

use NamespacedDummyResource;

use NamespacedDummyService;

use BaseNamespaceResource\EmptyResource;

use BaseNamespaceController\Controller;

class DummyClass extends Controller

{

    public function index(DummyRequest $request){

        $validated = $request->validated();

        $dummyModels = DummyModel::query()

            ->filter($validated)

            ->orderByDesc('id')

            ->paginate();

        return DummyResource::collection($dummyModels);

    }

    ···

}

TODO

  1. 前端根據元件生成
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章