JapanAnimeTime / Template
用于引导Laravel项目开始的代码生成器
dev-main
2023-03-28 19:23 UTC
Requires
- php: ^8.2
- jan-swiecki/simple-annotations: ^0.3.1
- laravel/framework: ^10
- laravel/sanctum: *
- spatie/eloquent-sortable: ^4
- spatie/laravel-collection-macros: ^7
- spatie/laravel-query-builder: ^5
- spatie/valuestore: ^1
This package is not auto-updated.
Last update: 2024-09-24 20:12:03 UTC
README
它是用来做什么的?
此包可以从单个配置生成项目基础
生成结果是
- 每个实体的合约
- 每个实体的迁移
- 每个实体的模型
- 带有验证的GET、CREATE、UPDATE请求
- 每个实体的控制器
- 包含所有CRUD方法的基础仓库,由QueryFilters通过Pipeline进行配置
- 每个实体扩展自基础仓库的仓库
- 包含所有CRUD方法的基础服务
- 扩展自基础服务并为每个实体提供服务的服务
- 种子和工厂
- 每个实体的CRUD路由
- CRUD管理页面和Nuxt的基础结构
如何使用?
- 创建新的Laravel项目
- 完成所有必要的配置,例如填写.env
- composer require japananimetime/template
- 创建config/entities.php
- 在那里描述您的实体(以下为示例)
- php artisan make:entity
- 享受!
配置示例
<?php
return [
'user' => [
'fields' => [
'name' => [
'type' => 'string',
'nullable' => false,
'unique' => false,
'fillable' => true,
'faker' => [true, 'name()'],
'validation' => [
'create' => [
'string' => 'true',
'required' => 'true',
],
'update' => [
'string' => 'true',
],
'get' => [
],
],
],
'email' => [
'type' => 'string',
'nullable' => false,
'unique' => true,
'fillable' => true,
'faker' => [true, 'email()'],
'validation' => [
'create' => [
'string' => 'true',
'email' => 'email:rfc,dns',
'required' => 'true',
],
'update' => [
'string' => 'true',
'email' => 'email:rfc,dns',
],
'get' => [
],
],
],
'email_verified_at' => [
'type' => 'string',
'nullable' => true,
'unique' => false,
'fillable' => true,
'faker' => [true, 'unixTime()'],
'validation' => [
'create' => [
],
'update' => [
],
'get' => [
],
],
],
'phone' => [
'type' => 'string',
'nullable' => false,
'unique' => true,
'fillable' => true,
'faker' => [true, 'phoneNumber'],
'validation' => [
'create' => [
'string' => 'true',
'required' => 'true',
],
'update' => [
'string' => 'true',
],
'get' => [
],
],
],
'password' => [
'type' => 'string',
'nullable' => true,
'unique' => false,
'fillable' => true,
'faker' => [false, '\\Illuminate\\Support\\Facades\\Hash::make(\'123456\')'],
'validation' => [
'create' => [
'string' => 'true',
'password' => ['required', 'confirmed', 'Illuminate\Validation\Rules\Password::min(6)'],
'required' => 'true',
],
'update' => [
'string' => 'true',
'password' => ['required', 'confirmed', 'Illuminate\Validation\Rules\Password::min(6)'],
],
'get' => [
],
],
],
'remember_token' => [
'type' => 'string',
'nullable' => true,
'unique' => false,
'fillable' => false,
'faker' => [false, 'null'],
'validation' => [
'create' => [
],
'update' => [
],
'get' => [
],
],
],
'subscription' => [
'type' => 'bool',
'nullable' => false,
'unique' => false,
'fillable' => true,
'faker' => [true, '1'],
'validation' => [
'create' => [
'required' => 'true'
],
'update' => [
'bool' => 'true'
],
'get' => [
]
]
],
'city' => [
'type' => 'string',
'nullable' => false,
'unique' => false,
'fillable' => true,
'faker' => [true, 'city()'],
'validation' => [
'create' => [
'string' => 'true',
'required' => 'true',
],
'update' => [
'string' => 'true',
],
'get' => [
],
],
],
'language' => [
'type' => 'string',
'nullable' => false,
'unique' => false,
'fillable' => true,
'faker' => [true, 'language()'],
'validation' => [
'create' => [
'string' => 'true',
'required' => 'true',
],
'update' => [
'string' => 'true',
],
'get' => [
],
],
],
],
'requests' => [
'create' => [
'auth' => true,
],
'update' => [
'auth' => true,
],
'get' => [
'auth' => false,
],
],
'softDeletes' => true,
'pageLength' => 16,
],
'category' => [
'fields' => [
'title' => [
'type' => 'string',
'nullable' => false,
'unique' => false,
'fillable' => true,
'faker' => [true, 'title()'],
'validation' => [
'create' => [
'string' => 'true',
'required' => 'true',
],
'update' => [
'string' => 'true',
],
'get' => [
],
],
],
'image' => [
'type' => 'string',
'nullable' => false,
'unique' => false,
'fillable' => true,
'faker' => [true, 'imageUrl(640, 480)'],
'validation' => [
'create' => [
'string' => 'true',
'required' => 'true',
],
'update' => [
'string' => 'true',
],
'get' => [
],
],
],
],
'requests' => [
'create' => [
'auth' => true,
],
'update' => [
'auth' => true,
],
'get' => [
'auth' => false,
],
],
'softDeletes' => true,
'pageLength' => 16,
],
'product' => [
'fields' => [
'category_id' => [
'type' => 'unsignedBigInteger',
'nullable' => true,
'unique' => false,
'fillable' => true,
'faker' => [false, '\\App\\Models\\Category::inRandomOrder()->first() ? \\App\\Models\\Category::inRandomOrder()->first()->id : null'],
'validation' => [
'create' => [
'integer' => 'true',
],
'update' => [
'integer' => 'true',
],
'get' => [
],
],
],
'title' => [
'type' => 'string',
'nullable' => false,
'unique' => false,
'fillable' => true,
'faker' => [true, 'title()'],
'validation' => [
'create' => [
'string' => 'true',
'required' => 'true',
],
'update' => [
'string' => 'true',
],
'get' => [
],
],
],
'image' => [
'type' => 'string',
'nullable' => false,
'unique' => false,
'fillable' => true,
'faker' => [true, 'imageUrl(640, 480)'],
'validation' => [
'create' => [
'string' => 'true',
'required' => 'true',
],
'update' => [
'string' => 'true',
],
'get' => [
],
],
],
'description' => [
'type' => 'text',
'nullable' => false,
'unique' => false,
'fillable' => true,
'faker' => [true, 'text'],
'validation' => [
'create' => [
'string' => 'true',
'required' => 'true',
],
'update' => [
'string' => 'true',
],
'get' => [
],
],
],
'price' => [
'type' => 'integer',
'nullable' => false,
'unique' => false,
'fillable' => true,
'faker' => [false, 'integer'],
'validation' => [
'create' => [
'string' => 'true',
'required' => 'true',
],
'update' => [
'string' => 'true',
],
'get' => [
],
],
]
],
'requests' => [
'create' => [
'auth' => true,
],
'update' => [
'auth' => true,
],
'get' => [
'auth' => false,
],
],
'softDeletes' => true,
'pageLength' => 16,
],
];
使用Pipeline的QueryFilter
QueryFilter
<?php
namespace App\v2\QueryFilters\Product;
use App\v2\Contracts\ProductContract;
class Hidden
{
/**
* @param \Illuminate\Database\Eloquent\Builder $query
* @param $next
*
* @return mixed
*/
public function handle(\Illuminate\Database\Eloquent\Builder $query, $next)
{
if(request()->has('hidden')){
$query->where(ProductContract::HIDDEN, true);
}
return $next($query);
}
}
控制器
<?php
namespace App\Http\Controllers\API\V1;
use App\Http\Controllers\Controller;
use App\QueryFilters\Product\Hidden;
use App\Http\Requests\GetProductRequest;
use App\Services\ProductService;
use Illuminate\Http\Request;
class ProductController extends Controller
{
private ProductService $productService;
public function __construct(ProductService $productService)
{
$this->productService = $productService;
}
public function universal(Request $request)
{
$result = $this->productService->paginate(
[
Hidden::class,
]
);
return response($result['message'], $result['status']);
}
Nuxt上的基础CRUD管理
生成后,您将在public中获得admin文件夹
在某个地方创建新的Nuxt项目,并将admin文件夹中的内容复制到Nuxt项目中
待办事项
- 修复生成文件的格式
- 使管理页面更易于使用,至少添加对不同字段的支持,例如图像插件而不是仅文本字段
- 完成配置创建的图形界面