jannisfieml / laravelapigenerator
一个通过编辑yaml文件生成基本迁移、模型、请求、控制器和路由的小型包
Requires
- php: ^8.0
- illuminate/contracts: ^8.37
- nette/php-generator: ^3.5
- nikic/php-parser: ^4.10
- spatie/laravel-package-tools: ^1.4.3
- symfony/yaml: ^5.2
Requires (Dev)
- brianium/paratest: ^6.2
- nunomaduro/collision: ^5.3
- orchestra/testbench: ^6.15
- phpunit/phpunit: ^9.3
- spatie/laravel-ray: ^1.9
- vimeo/psalm: ^4.4
This package is auto-updated.
Last update: 2024-09-06 21:51:06 UTC
README
安装
您可以通过composer安装此包
composer require jannisfieml/laravelapigenerator
您可以使用以下命令发布配置文件
php artisan vendor:publish --provider="JannisFieml\LaravelApiGenerator\LaravelApiGeneratorServiceProvider" --tag="config"
这是发布配置文件的内容
<?php // config for Jannisfieml/LaravelApiGenerator return [ // Class that every generated Controller extends 'controller_base_class' => 'App\Http\Controllers\Controller', // Class that every generated Model extends 'model_base_class' => 'Illuminate\Database\Eloquent\Model', ];
用法
一般
此包为您Laravel API生成基本功能。您可以直接使用它们,但在某些情况下,您可能需要自行更改一些内容。生成的文件仍然可以为您提供一个很好的起点,并在项目初期减少开发时间。
在您更改了模式并重新运行命令后,生成的文件将更新,因此请记住,您的手动更改将被覆盖。请确保您的模式符合您的预期,然后再更改代码或直接不重新运行命令。
迁移、模型、请求和控制器都分别通过单独的命令分割,因此您也可以选择只更新您未修改的文件类型(例如模型)。
从创建您的模式开始
此命令生成一个.yaml文件,您可以使用它来编写模型定义
php artisan generate:schema MyModel
生成的0_my_model.yaml看起来像这样
name: "MyModel" attributes: - name: "attribute" type: "string" props: [] validations: [] hasMany: [] belongsToMany: []
根据您的需要修改文件。名称不需要与模式文件本身具有相同的标题,但这有助于保持条理。
数字前缀很重要,因为它用于排序迁移。一些表需要在其他表之前创建,因此文件应该按照迁移执行的顺序。
- name: 模型的名称
- attributes: 模型属性的数组。数字ID和时间戳将自动生成。
- name: 属性的名称
- type: 在迁移中使用的类型(例如,“integer”,“string”,“foreignId”...)
- props: 在迁移中使用的属性数组(例如,“nullable”,“constrained”...)
- validations: 默认Laravel验证的数组(例如,“required”,“existing:users,id”...)
- hasMany: 与此模型有HasMany关系的模型数组
- belongsToMany: 与此模型有BelongsToMany关系的模型数组
此命令始终生成新文件,不会修改现有文件。其他所有命令都将遍历schema目录并根据您的定义生成文件。
以下示例将使用此模式
name: "MyModel" attributes: - name: "name" type: "string" props: [] validations: ["required", "unique:my_model,id"] - name: "description" type: "text" props: ["nullable"] validations: [] - name: "amount" type: "integer" props: ["nullable"] validations: [] - name: "related_model_id" type: "foreignId" props: ["constrained"] validations: ["required"] hasMany: [] belongsToMany: []
生成您的迁移
php artisan generate:migrations
生成的迁移将看起来像这样
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateMyModelsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('my_models', function (Blueprint $table) { $table->id(); $table->timestamps(); $table->string('name'); $table->text('description')->nullable(); $table->integer('amount')->nullable(); $table->foreignId('related_model_id')->constrained(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('my_models'); } }
像往常一样运行您的迁移。
php artisan migrate
生成您的模型
php artisan generate:models
如您所见,模型将任何定义的属性放入模型的fillable属性中。属性的Getters和Setters以及外键的BelongsTo方法也生成。
生成的模型将看起来像这样
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class MyModel extends Model { use HasFactory; /** * The table associated with the model. * * @var string */ protected $table = 'my_models'; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = ['name', 'description', 'amount', 'related_model_id']; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = []; /** * The attributes that should be cast to native types. * * @var array */ protected $casts = []; public function getId(): int { return $this->getAttribute('id'); } public function getName(): string { return $this->getAttribute('name'); } public function setName(string $name): self { $this->setAttribute('name', $name); return $this; } public function getDescription(): string { return $this->getAttribute('description'); } public function setDescription(string $description): self { $this->setAttribute('description', $description); return $this; } public function getAmount(): int { return $this->getAttribute('amount'); } public function setAmount(int $amount): self { $this->setAttribute('amount', $amount); return $this; } public function getRelatedModelId(): int { return $this->getAttribute('related_model_id'); } public function setRelatedModelId(int $related_model_id): self { $this->setAttribute('related_model_id', $related_model_id); return $this; } public function relatedModel(): BelongsTo { return $this->belongsTo(RelatedModel::class); } }
生成请求
php artisan generate:requests
请求用于生成的控制器中的创建和更新操作。为这两个操作分别创建了特定的请求。
生成的请求将看起来像这样
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class CreateMyModelRequest extends FormRequest { public function authorize(): bool { return true; } public function rules(): array { return [ 'name' => 'required|unique:my_model,id|string', 'description' => 'string', 'amount' => 'int', 'related_model_id' => 'required|int', ]; } }
生成控制器
php artisan generate:controllers
生成的控制器专门用于API CRUD操作,因此返回特定的ApiResponse,没有视图。您可以自行更改,但如前所述,如果再次运行命令,则命令将覆盖您的更改。
生成的控制器将看起来像这样
<?php namespace App\Http\Controllers; use App\Http\Requests\CreateMyModelRequest; use App\Http\Requests\UpdateMyModelRequest; use App\Models\MyModel; use Jannisfieml\LaravelApiGenerator\Responses\ApiDataResponse; use Jannisfieml\LaravelApiGenerator\Responses\ApiErrorResponse; use Jannisfieml\LaravelApiGenerator\Responses\ApiResponse; use Jannisfieml\LaravelApiGenerator\Services\ArrayTransformerService; class MyModelController extends Controller { public function getMyModels(): ApiResponse { $data = MyModel::all(); return new ApiDataResponse($data->toArray()); } public function createMyModel(CreateMyModelRequest $request): ApiResponse { $arrayTransformerService = new ArrayTransformerService(); $myModel = new MyModel( $arrayTransformerService->transformToSnakeCase($request->toArray()) ); $myModel->save(); return new ApiDataResponse($myModel->toArray()); } public function updateMyModel(UpdateMyModelRequest $request, int $id): ApiResponse { $arrayTransformerService = new ArrayTransformerService(); $myModel = MyModel::find($id); $myModel->update( $arrayTransformerService->transformToSnakeCase($request->toArray()) ); $myModel->save(); return new ApiDataResponse($myModel->toArray()); } public function deleteMyModel(int $id): ApiResponse { $myModel = MyModel::find($id); $myModel->delete(); return new ApiDataResponse(); } }
生成路由
php artisan generate:routes
生成的路由提供了您可以通过它们调用的生成控制器的路由。您可以使用自己的逻辑或更改这些路由调用的控制器和函数。
此命令会将注释和生成的路由追加到api.php路由文件中。您可以将其移动到生成的注释上方并编辑它们,这样未来调用此命令就不会重新写入它们。如果您编辑注释本身,则执行命令将再次将所有内容追加到api.php文件中,就像命令从未运行过一样(该命令用于识别api.php路由文件中自动生成的部分)。
生成的路由将如下所示
<?php use Illuminate\Support\Facades\Route; // ... probably your other routes if you have any /* |-------------------------------------------------------------------------- | These are auto-generated routes of @JannisFieml/apigenerator | Please don't edit this comment or any lines below! | Otherwise automated updates of this code won't be possible. | ...but I am just a comment, so do what you want |-------------------------------------------------------------------------- */ Route::middleware([])->group(function () { Route::get('/related-models', [App\Http\Controllers\RelatedModelController::class, 'getRelatedModels']); Route::post('/related-models', [App\Http\Controllers\RelatedModelController::class, 'createRelatedModel']); Route::put('/related-models/{id}', [App\Http\Controllers\RelatedModelController::class, 'updateRelatedModel']); Route::delete('/related-models/{id}', [App\Http\Controllers\RelatedModelController::class, 'deleteRelatedModel']); }); Route::middleware([])->group(function () { Route::get('/main-models', [App\Http\Controllers\MainModelController::class, 'getMainModels']); Route::post('/main-models', [App\Http\Controllers\MainModelController::class, 'createMainModel']); Route::put('/main-models/{id}', [App\Http\Controllers\MainModelController::class, 'updateMainModel']); Route::delete('/main-models/{id}', [App\Http\Controllers\MainModelController::class, 'deleteMainModel']); });
生成Insomnia导出
php artisan generate:insomnia
此命令生成一个文件,您可以在Insomnia中导入以测试您的API路由。此命令仅生成该包将生成的路由/控制器导出。
您可以在项目根目录下的Insomnia目录中找到您的导出文件。
测试
composer test
变更日志
有关最近更改的更多信息,请参阅变更日志。
贡献
有关详细信息,请参阅贡献指南。
安全漏洞
有关如何报告安全漏洞的详细信息,请参阅我们的安全策略。
致谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。