abd-wazzan/laravel-api-boilerplate

一个采用领域驱动设计(DDD)结构、基本配置和预安装常用软件包的Laravel项目,旨在构建API。

v1.0 2023-03-28 17:55 UTC

This package is auto-updated.

Last update: 2024-09-13 20:43:51 UTC


README

Laravel API Boilerplate

一个具有领域驱动设计(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/ 目录用于助手、特性、枚举等,这些将在应用程序和领域中用到。

反馈

我很乐意听取您的反馈!如果您有任何建议或意见,请通过电子邮件发送给邮箱