abd-wazzan / laravel-api-boilerplate
一个采用领域驱动设计(DDD)结构、基本配置和预安装常用软件包的Laravel项目,旨在构建API。
Requires
- php: ^8.1
- guzzlehttp/guzzle: ^7.5
- laravel/framework: ^10.4
- laravel/passport: ^11.8
- laravel/tinker: ^2.8
- lorisleiva/laravel-actions: ^2.5
- spatie/laravel-data: ^3.2
- spatie/laravel-query-builder: ^5.2
Requires (Dev)
- barryvdh/laravel-ide-helper: ^2.13
- fakerphp/faker: ^1.21.0
- knuckleswtf/scribe: ^4.17
- laravel/pint: ^1.7
- laravel/sail: ^1.21
- laravel/telescope: ^4.14
- mockery/mockery: ^1.5.1
- nunomaduro/collision: ^7.3
- pestphp/pest: ^2.2
- pestphp/pest-plugin-laravel: ^2.0
- phpro/grumphp: ^1.15
- roave/security-advisories: dev-latest
- spatie/laravel-ignition: ^2.0
This package is auto-updated.
Last update: 2024-09-13 20:43:51 UTC
README
一个具有领域驱动设计(DDD)结构、基本配置和预安装并配置的常用软件包的 Laravel 项目,帮助您开始构建下一个大型应用程序。
要求
- PHP ^8.1
- Composer ^2.2
安装
composer create-project abd-wazzan/laravel-api-boilerplate api-app
安装依赖项
cd api-app
composer install
设置 .env 文件
cp .env.example .env
生成应用程序密钥
php artisan key:generate
本地运行
php artisan serve
已安装软件包
常规
开发
功能
DDD
一种软件开发方法,试图将业务语言和源代码尽可能接近。
这种结构受到了 LARAVEL BEYOND CRUD 的启发。
文件结构
领域层示例
src/Domain/Invoices/
├── Actions
├── QueryBuilders
├── Collections
├── Data
├── Events
├── Exceptions
├── Listeners
├── Models
├── Rules
└── States
src/Domain/Products/
├── Actions
└── .....
应用层示例
The REST API application:
src/App/Api/
├── Products
├── Controllers
├── Middlewares
├── Requests
├── Queries
├── Filters
└── Resources
The Console application
src/App/Console/
└── Commands
The admin HTTP application:
src/App/Admin/
├── Products
├── Controllers
├── Middlewares
├── Requests
├── Resources
├── Queries
├── Filters
└── ViewModels
依赖说明
资源
API 响应助手
一个简单的特性,允许在整个Laravel应用程序中保持一致的API响应。
可用方法
用法示例
<?php namespace App\Http\Api\Controllers; use App\Traits\ApiResponseHelpers; use Illuminate\Http\JsonResponse; use App\Http\Controller; class ProductController extends Controller { use ApiResponseHelper; public function index(): JsonResponse { return $this->okResponse(); } }
Scribe Api 标签
与ApiResponseHelper响应匹配的附加scribe标签。
可用的响应标签
其他可用的标签
用法示例
<?php namespace App\Http\Api\Controllers; use App\Helpers\ApiController; use App\Traits\ApiResponseHelpers; use Illuminate\Http\JsonResponse; use App\Http\Controller; /** * Class CategoryController * @group Category */ class CategoryController extends Controller { use ApiResponseHelper; /** * Get Categories * * this request is used to get all categories. * * @queryParam filter[name] * * @usesPagination * @failedResponse * @forbiddenResponse * @throws \Illuminate\Auth\Access\AuthorizationException * @throws \Throwable */ public function index(): Response { return CategoryResource::collection($categories->all()); } }
全局助手
一个简单的php文件,其中包含您全局函数,您可以在 ./src/shared/Helpers/global.php
中找到它。
迁移结构
为了按领域分组迁移文件,您可以创建额外的迁移目录,并在 AppServiceProvider
中使用 loadMigrationsFrom
函数加载它们
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot() { $this->loadMigrationsFrom([ database_path().DIRECTORY_SEPARATOR.'migrations'.DIRECTORY_SEPARATOR.'Client', ]); } }
多态映射
请首先阅读此 文章 以识别问题。
为了实现多态映射,我们创建了一个 MorphEnum
,其中包含每个模型多态键,然后在 Relation::morphMap
函数中使用它,如示例所示
<?php namespace Shared\Enums; enum MorphEnum: string { case USER = 'user'; }
<?php namespace App\Providers; use Shared\Enums\MorphEnum; use Domain\Client\Models\User; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot() { Relation::morphMap([ MorphEnum::USER->value => User::class, ]); } }
数据库播种器
我们通常有两种类型的数据
- 初始数据:项目没有它不能工作。例如,国家表数据,这些数据通常来自数据集。
- 伪造数据:用于测试目的,可以填充任何表而不是逐行手动插入,这些数据通常由工厂生成。
为了防止伪造数据在生产环境中播种,我们创建了一个名为 TestingSeeder.php
的新播种器类,它将包含所有伪造数据播种器,并且只在不生产环境中运行。正常的播种器将保留在 DatabaseSeeder.php
中。
共享目录
使用 src/shared/
目录用于助手、特性、枚举等,这些将在应用程序和领域中用到。
反馈
我很乐意听取您的反馈!如果您有任何建议或意见,请通过电子邮件发送给邮箱。