sarkis-sh/laravel-spray
一个用于加速项目设置和简化 API 开发的 Laravel 代码生成工具。
Requires
- php: >=7.4
- doctrine/inflector: ^2.0
- guzzlehttp/guzzle: ^7.8
This package is auto-updated.
Last update: 2024-09-23 13:10:03 UTC
README
Spray 是一个针对 Laravel 开发的强大工具,专注于代码生成。它允许开发者专注于项目的业务逻辑,无需担心常规的 API 和代码任务。
先决条件
在开始使用 Spray 之前,请确保您有以下内容
- 为您的项目准备好的 MySQL 数据库。
- 一个空的 Laravel 项目,并在
.env
文件中初始化了数据库连接。 - 以下路径存在于您的环境变量中
C:\Users\{UserName}\AppData\Roaming\Composer\vendor\bin
入门指南
要使用 Spray,请按照以下步骤操作
- 在项目根目录内打开终端并运行命令
s-spray
。 - 您也可以在任意项目中运行
s-spray
命令并选择您想要的项目或添加一个新项目。 - 按照提示操作。
Spray 将检查该目录是否为 Laravel 目录。之后,它将提示您输入您的 Postman 账户的 X-API-KEY 和您项目的集合 ID。您可以跳过此步骤,稍后添加这些字段。此步骤是必要的,以便在您的 Postman 集合中创建和更新您的 API。
您还可以自定义在 Postman 集合中生成的 Store 和 Bulk Store API 的正文类型。默认正文类型设置为 RAW JSON。但是,您可以选择以下选项之一
- Urlencoded
- Formdata
- Raw JSON
这允许您选择最适合您的 API 需求和偏好的正文类型。
代码生成
Spray 在您第一次使用它时会将重要文件复制到您的项目中。这些文件对于使您的项目准备就绪和添加新 API 至关重要。这些文件包括
- 用于资源、响应和文件管理(例如文件上传)的特质文件。
- 阿拉伯语和英语的语言文件。
- 重要的中间件,如 CORS、认证和 SetLocale。如果您想使用它们,请确保在您的
App\Http\Kernel.php
文件中注册这些中间件。注册中间件后,您可以在App\Providers\RouteServiceProvider.php
或根据您的需求使用任何特定路由中调用它们。 - 通用异常处理器。
- 通用的控制器、服务、模型、表单请求和资源类。这些类构成了我们项目的主要结构,遵循面向服务的架构(SOA),并处理所有常规 API,包括获取所有、按 ID 查找、存储、批量存储、更新、删除和批量删除。
注意:您可以在 Spray 项目的 resources
目录中找到这些文件。
Spray 还将建模数据库结构并保存它以进行 监控。它将显示所有现有表列表,并允许您选择任何表或选择所有表,并提供生成 API 的选项。
代码生成过程包括
- 生成一个扩展通用控制器的控制器。
- 生成一个扩展通用服务的服务。
- 生成一个扩展通用模型的模型,包括填充数组、时间戳属性以及任何 hasMany 或 belongsTo 关系。
- 生成一个请求,该请求扩展了通用的请求,并带有用于您所选API的验证器,填充基于表结构的规则。
- 生成一个资源,该资源扩展了通用的资源,并基于表列填充了一个数组。
- 生成一个工厂,每个列都填充了faker,使用列名作为内置函数或使用列类型进行自定义伪造。
- 根据您所选的API生成路由,并将它们追加到
routes/api.php
文件中。 - 在您的Postman收藏中生成API,让您可以方便地测试和与之交互。
- 在语言文件中填充基于您独特的数据库表列的验证属性,翻译成英语,并在阿拉伯文件中留空。
代码生成过程完成后,您所选的表的所有生成的API都准备好了,无需任何进一步编辑。只需运行php artisan optimize
即可完成生成过程。
监控和更新
Spray会持续监控数据库中的任何更改,例如添加、更新或删除列或添加新表。它将在控制台中突出显示更新的表,以提醒您更改。
Spray还可以更新所有之前生成的代码,包括表单请求、资源、模型填充和时间戳属性、工厂、Postman收藏和语言文件。此功能通过自动更新生成的代码以反映数据库中的任何更改来节省您的时间。
要求
- PHP版本7.4或更高。
安装
您可以使用Composer安装Spray。
composer global require sarkis-sh/laravel-spray
或者,您可以将仓库克隆并运行bin
文件夹中的文件。
使用方法
Spray是一个基于控制台的工具。只需遵循Spray在终端中提供的说明。
示例
用户表
生成的类
UserController
<?php namespace App\Http\Controllers; use App\Http\Requests\UserRequest; use App\Http\Resources\UserResource; use App\Services\UserService; use App\Models\User; class UserController extends GenericController { public function __construct(private UserService $userService) { parent::__construct(new UserRequest(), new UserResource([]), new UserService(new User())); } }
UserService
<?php namespace App\Services; class UserService extends GenericService { }
User Model
<?php namespace App\Models; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; class User extends GenericModel { use HasApiTokens, HasFactory, Notifiable; protected $table = 'users'; protected $fillable = [ 'name', 'age', 'email', 'password', ]; /** * Get all posts for the User * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function posts(): HasMany { return $this->hasMany(Post::class, 'user_id', 'id'); } }
UserRequest
<?php namespace App\Http\Requests; class UserRequest extends GenericRequest { /** * Dynamically Get the the validation rules based on the request's action method. * * @return array */ public function rules() { $method = request()->route()->getActionMethod(); return $this->{$method . 'Validator'}(); } /** * Validation rules for the 'store' action. * * @return array */ private function storeValidator() { return [ 'name' => 'required|string|max:100', 'age' => 'nullable|integer', 'email' => 'required|string|max:51|unique:users,email', 'password' => 'required|string|max:255', ]; } /** * Validation rules for the 'bulkStore' action. * * @return array */ private function bulkStoreValidator() { return [ 'list' => 'required|array', 'list.*.name' => 'required|string|max:100', 'list.*.age' => 'nullable|integer', 'list.*.email' => 'required|string|max:51|unique:users,email', 'list.*.password' => 'required|string|max:255', ]; } /** * Validation rules for the 'update' action. * * @return array */ private function updateValidator() { return [ 'name' => 'required|string|max:100', 'age' => 'nullable|integer', 'email' => 'required|string|max:51|unique:users,email,' . $this->id . ',id', 'password' => 'required|string|max:255', ]; } /** * Validation rules for the 'bulkDelete' action. * * @return array */ private function bulkDeleteValidator() { return [ 'ids' => 'required|array', 'ids.*' => 'required|integer|exists:users,id', ]; } }
UserResource
<?php namespace App\Http\Resources; class UserResource extends GenericResource { /** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable */ public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'age' => $this->age, 'email' => $this->email, 'password' => $this->password, 'created_at' => $this->created_at, ]; } }
UserFactory
<?php namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; class UserFactory extends Factory { /** * Define the model's default state. * * @return array */ public function definition() { return [ 'name' => $this->faker->name(), 'age' => $this->faker->numberBetween(0, 2147483647), 'email' => $this->faker->unique()->safeEmail(), ]; } }
路由
Route::group([ 'prefix' => '/users', 'controller' => UserController::class, // 'middleware' => '' ], function () { Route::delete('/', 'bulkDelete'); Route::delete('/{id}', 'delete'); Route::put('/{id}', 'update'); Route::post('/bulk', 'bulkStore'); Route::post('/', 'store'); Route::get('/{id}', 'findById'); Route::get('/', 'getAll'); });
许可证
Spray是在MIT许可证下发布的。
未来计划
增强Spray以支持多种SQL数据库,包括但不限于MySQL、SQL Server、SQLite、PostgreSQL等。