jannisfieml/laravelapigenerator

一个通过编辑yaml文件生成基本迁移、模型、请求、控制器和路由的小型包

dev-main 2021-06-06 15:01 UTC

This package is auto-updated.

Last update: 2024-09-06 21:51:06 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

安装

您可以通过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)。有关更多信息,请参阅许可证文件