andro-adel/microservice-package

初始化日志、使用 rabbitmq 进行消息传递、redis 缓存所需的包

0.1.40 2024-02-26 10:51 UTC

README

Build Status Total Downloads Latest Stable Version License

关于包

这是一个用于与每个微服务一起使用的laravel包,用于设置主要包和配置。

将要安装的包

安装

您可以通过composer安装此包

composer require andro-adel/microservice-package -W

供应商发布

发布所有文件

php artisan vendor:publish --provider="DD\MicroserviceCore\MicroserviceCoreServiceProvider"

单独发布配置文件

php artisan vendor:publish --tag=dd-config

单独发布语言文件

php artisan vendor:publish --tag=dd-lang

单独发布测试文件

./vendor/bin/pest --init

配置

此包在安装时在config文件夹中包含配置文件,扩展了项目配置从ddconfig。这些文件是

  • ddconfig.php - 此文件将用于配置微服务中使用的日志.channels和数据库.redis。
  • excel.php - 此文件将用于配置Excel文件的导出和导入。
  • scribe.php - 此文件将用于配置API文档。
  • services-communication.php - 此文件将用于配置服务通信。
  • snappy.php - 此文件将用于配置PDF文件的下载和流。

用法

ApiResponses

此函数将由微服务用于以标准方式返回响应。

use DD\MicroserviceCore\Classes\ApiResponses;

成功响应

此函数将用于返回包含数据、原因、消息、additionalData、状态的成功响应。

ApiResponses::successResponse(array $data, string $reason, string|null $message = null, array $additionData = [], $status = 200)

示例

return ApiResponses::successResponse(data: ["user" : $user], reason: "User retrieved successfully", additionData: ["extra" : "extra value"]);
{
  "status": 200,
  "success": true,
  "type": "success",
  "data": {
    "user": {
      "id": 1,
      "name": "John Doe",
      "email": "John@gmail.com"
    }
  },
  "reason": "User retrieved successfully",
  "message": "Done successfully",
  "extra": "extra value"
}

无内容成功响应

此函数将用于返回无内容的成功响应。

ApiResponses::successNoContentResponse()

示例

return ApiResponses::successNoContentResponse();

未修改响应

此函数将用于返回未修改的响应。

ApiResponses::notModifiedResponse(string|null $resourceName = null,string|null $message = null,array $additionData = [])

示例

return ApiResponses::notModifiedResponse(resource: "User", message: "User not modified", additionData: ["extra" : "extra value"]);
{
  "status": 304,
  "success": false,
  "type": "error",
  "reason": "Failure",
  "message": "User not modified",
  "extra": "extra value"
}

错误请求响应

此函数将用于返回错误请求的响应。

ApiResponses::badRequestResponse(string|null $message = null, array $additionData = [], $status = 400)

示例

return ApiResponses::badRequestResponse(message: "Invalid data", additionData: ["extra" : "extra value"]);
{
  "status": 400,
  "success": false,
  "type": "error",
  "reason": "Bad Request",
  "message": "Invalid data",
  "extra": "extra value"
}

未授权响应

此函数将用于返回未授权的响应。

ApiResponses::unauthorizedResponse(string|null $message = null, array $additionData = [])

示例

return ApiResponses::unauthorizedResponse(message: "Unauthorized User", additionData: ["extra" : "extra value"]);
{
  "status": 403,
  "success": false,
  "type": "error",
  "reason": "Unauthorized",
  "message": "Unauthorized User",
  "extra": "extra value"
}

未认证响应

此函数将用于返回未认证的响应。

ApiResponses::unauthenticatedResponse(string|null $message = null, array $additionData = [])

示例

return ApiResponses::unauthenticatedResponse(message: "Unauthenticated User", additionData: ["extra" : "extra value"]);
{
  "status": 401,
  "success": false,
  "type": "error",
  "reason": "Unauthenticated",
  "message": "Unauthenticated User",
  "extra": "extra value"
}

未找到响应

此函数将用于返回未找到的响应。

ApiResponses::notFoundResponse(string|null $resourceName = null, string|null $message = null, array $additionData = [])

示例

return ApiResponses::notFoundResponse(resource: "User", message: "User not found", additionData: ["extra" : "extra value"]);
{
  "status": 404,
  "success": false,
  "type": "error",
  "reason": "Not Found",
  "message": "User not found",
  "extra": "extra value"
}

冲突响应

此函数将用于返回冲突的响应。

ApiResponses::conflictResponse(string $type,array $data,string|null $resourceName = null, string|null $message = null, array $additionData = [])

示例

return ApiResponses::conflictResponse(type:"User",data: ["user" : $user], resourceName: "User", message: "User already exists", additionData: ["extra" : "extra value"]);
{
  "status": 409,
  "success": false,
  "type": "User",
  "data": {
    "user": {
      "id": 1,
      "name": "John Doe",
      "email": "John@gmail.com"
    }
  },
  "reason": "Failure",
  "message": "User already exists",
  "extra": "extra value"
}

无效响应

此函数将用于返回无效的响应。

ApiResponses::notValidResponse(array $errors, array $data, string|null $message = null, array $additionData = [])

示例

return ApiResponses::notValidResponse(errors: ["name" : "Name is required"], data: ["user" : $user], message: "Invalid data", additionData: ["extra" : "extra value"]);
{
  "status": 422,
  "success": false,
  "type": "error",
  "reason": "Validation",
  "message": "Invalid data",
  "errors": {
    "name": "Name is required"
  },
  "data": {
    "user": {
      "id": 1,
      "email": "john.doe@gmail.com"
    }
  },
  "extra": "extra value"
}

服务器错误响应

此函数将用于返回服务器错误的响应。

ApiResponses::serverErrorResponse(string|int  $errorCode,string|null $message = null, array $additionData = [])

示例

return ApiResponses::serverErrorResponse(errorCode: 500, message: "Server error", additionData: ["extra" : "extra value"]);
{
  "status": 500,
  "success": false,
  "type": "error",
  "reason": "Exceptions",
  "message": "Server error",
  "errorCode": 500,
  "extra": "extra value"
}

成功分页响应

此函数将用于返回成功分页的响应。

ApiResponses::successPaginationResponse(LengthAwarePaginator $data, string $reason = 'Show', string|null $message = null, array $additionData = [])

示例

return ApiResponses::successPaginationResponse(data: $users, reason: "Users retrieved successfully", additionData: ["extra" : "extra value"]);
{
  "status": 200,
  "success": true,
  "type": "success",
  "data": {
    "current_page": 1,
    "data": [
      {
        "id": 1,
        "name": "John Doe",
        "email": "john.doe@gmail.com"
      },
      {
        "id": 2,
        "name": "Jane Doe",
        "email": "jane.doe@gmail.com"
      },
      {
        "id": 3,
        "name": "Ahmed",
        "email": "ahmed@gmail.com"
      }
    ],
    "first_page_url": "https://:8000/api/users?page=1",
    "from": 1,
    "last_page": 1
  },
  "reason": "Users retrieved successfully",
  "message": "Done successfully",
  "extra": "extra value"
}

成功显示分页响应

此函数将用于返回成功显示分页的响应。

ApiResponses::successShowPaginationResponse($data, $meta, string $reason = 'Show')

示例

return ApiResponses::successShowPaginationResponse(data: $users, meta: $meta, reason: "Users retrieved successfully");
{
  "status": 200,
  "success": true,
  "type": "success",
  "data": {
    "current_page": 1,
    "data": [
      {
        "id": 1,
        "name": "John Doe",
        "email": "john.doe@gmail.com",
        "created_at": "2022-01-01T00:00:00.000000Z",
        "updated_at": "2022-01-01T00:00:00.000000Z"
      },
      {
        "id": 2,
        "name": "ahmed Doe",
        "email": "ahmed.doe@gmail.com",
        "created_at": "2022-01-01T00:00:00.000000Z",
        "updated_at": "2022-01-01T00:00:00.000000Z"
      }
    ],
    "first_page_url": "https://:8000/api/users?page=1",
    "from": 1,
    "last_page": 1
  },
  "reason": "Users retrieved successfully",
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 1,
    "path": "https://:8000/api/users",
    "per_page": 15,
    "to": 2,
    "total": 2
  }
}

成功显示分页数据响应

此函数将用于返回成功显示分页数据的响应。

ApiResponses::successShowPaginatedDataResponse(JsonResource $data, string $reason = 'Show')

示例

return ApiResponses::successShowPaginatedDataResponse(data: $users, reason: "Users retrieved successfully");
{
  "status": 200,
  "success": true,
  "type": "success",
  "data": {
    "id": 1,
    "name": "John Doe",
    "email": "john.doe@gmail.com",
    "created_at": "2022-01-01T00:00:00.000000Z",
    "updated_at": "2022-01-01T00:00:00.000000Z"
  },
  "reason": "Users retrieved successfully",
  "count": 1
}

成功创建响应

此函数将用于返回成功创建的响应。

ApiResponses::createdSuccessfullyResponse($data = null, string|null $resourceName = null,?string $message = null)

示例

return ApiResponses::createdSuccessfullyResponse(data: ["user" : $user], resourceName: "User", message: "User created successfully");
{
  "status": 201,
  "success": true,
  "type": "success",
  "data": {
    "user": {
      "id": 1,
      "name": "John Doe",
      "email": "john.doe@gmail.com",
      "created_at": "2022-01-01T00:00:00.000000Z",
      "updated_at": "2022-01-01T00:00:00.000000Z"
    }
  },
  "reason": "Created",
  "message": "User created successfully"
}

缓存

此功能将由微服务用于处理缓存数据。

use DD\MicroserviceCore\Classes\Caching;

从缓存类创建对象

  • 从缓存类创建对象
$caching = new Caching();

在对象创建时,您可以通过将连接名称传递给构造函数来更改默认连接。

$caching = new Caching('connection_name');

或者您可以在对象创建后使用 setConnection 函数更改默认连接。

$caching->setConnection('connection_name');
  • 注入缓存类
public function __construct(protected readonly Caching $caching) {}

在对象创建后,您可以使用 setConnection 函数更改默认连接。

$caching->setConnection('connection_name');

缓存功能

  • 设置缓存
$caching->set(string $key, mixed $value);
  • 使用选项设置缓存
use DD\MicroserviceCore\Classes\SetOptions;
$options = new SetOptions();
$options->setExpiration(int $ttl);
$options->setExpirationTimestamp(string $timestamp);
$options->setExpirationInMilliseconds(int $ttl);
$options->setExpirationTimestampInMilliseconds(string $timestamp);
$options->setExpirationSameAsOld();
$options->returnOldValue();
$options->setIfNew();
$options->setIfExist();
$caching->set(string $key, mixed $value, SetOptions $options);
  • 设置多个缓存
$values = [
   'key1' => 'value1',
   'key2' => 'value2',
   'key3' => 'value3',
];
$caching->setMany(array $values);
  • 获取缓存
$caching->get(string|array $key);
  • 重命名键
$caching->rename(string $oldKey, string $newKey);
  • 删除缓存
$caching->delete(string|array $key);
  • 获取键类型
$caching->getType(string $key);
  • 设置过期时间
$caching->setExpire(string $key, int $ttl);
  • 使用选项设置过期时间
use DD\MicroserviceCore\Classes\ExpireOptions;
$options = new ExpireOptions();
$options->setIfNew();
$options->setIfExist();
$options->setIfGreaterThanCurrent();
$options->setIfLessThanCurrent();
$caching->set(string $key, int $ttl, ExpireOptions $options);
  • 检查缓存是否存在
$caching->isKeyExist(string|array $key);
  • 键搜索
$caching->keySearching(string $pattern);
  • 获取所有键
$caching->getAllKeys();
  • 一起运行命令集
$caching->transaction(Closure $callback);
  • 运行命令
$caching->command(string $command, array $values);

过滤器

此功能将由微服务用于处理过滤数据。

use DD\MicroserviceCore\Classes\FilterManager;

从 FilterManager 类创建对象

  • 从 FilterManager 类创建对象
$filterManager = new FilterManager();

过滤数据是应用过滤器所使用的数据。

默认过滤数据将设置为带有 key filter 的请求数据,您可以在对象创建时通过将过滤数据传递给构造函数来设置过滤数据。

$filterManager = new FilterManager(array $filtersData);

或者您可以在对象创建后使用 setFiltersData 函数设置过滤数据。

$filterManager->setFiltersData(array $filtersData);
  • 注入 FilterManager 类
public function __construct(protected readonly FilterManager $filterManager) {}

您可以在对象创建后使用 setFiltersData 函数设置过滤数据。

$caching->setFiltersData(array $filtersData);

构建过滤器

  • 添加 Where 过滤器
$filterManager->addWhereFilter(string $column);

默认情况下,操作符将设置为 =,您可以将操作符传递给函数以应用于过滤器。

$filterManager->addWhereFilter(string $column, string $operator);

默认情况下,应用过滤器时,此 Where 过滤器的值将从与列名相同的键的过滤数据中获取,您可以将不同的键传递给函数以将值应用于过滤器。

$filterManager->addWhereFilter(string $column, string $operator, string $valueKey);
  • 添加 Where In 过滤器
$filterManager->addWhereInFilter(string $column);

默认情况下,应用过滤器时,此 Where 过滤器的值将从与列名相同的键的过滤数据中获取,您可以将不同的键传递给函数以将值应用于过滤器。

$filterManager->addWhereInFilter(string $column, string $valueKey);
  • 添加 Where Not In 过滤器
$filterManager->addWhereNotInFilter(string $column);

默认情况下,应用过滤器时,此 Where 过滤器的值将从与列名相同的键的过滤数据中获取,您可以将不同的键传递给函数以将值应用于过滤器。

$filterManager->addWhereNotInFilter(string $column, string $valueKey);
  • 添加 Where Has 过滤器 [注意:您不能与集合或数组数据一起使用此函数。]
$filterManager->addWhereHasFilter(string $relationName, Closure $callback);

默认情况下,应用过滤器时,此 Where 过滤器的值将从与关系名相同的键的过滤数据中获取,您可以将不同的键传递给函数以将值应用于过滤器。

$filterManager->addWhereHasFilter(string $relationName, Closure $callback, string $valueKey);
  • 添加 Where Has Morph 过滤器 [注意:您不能与集合或数组数据一起使用此函数。]
$filterManager->addWhereHasMorphFilter(string $relationName, string|array $types, Closure $callback);

默认情况下,应用过滤器时,此 Where 过滤器的值将从与关系名相同的键的过滤数据中获取,您可以将不同的键传递给函数以将值应用于过滤器。

$filterManager->addWhereHasMorphFilter(string $relationName, string|array $types, Closure $callback, string $valueKey);
  • 添加 Has 过滤器 [注意:您不能与集合或数组数据一起使用此函数。]
$filterManager->addHasFilter(string $relationName);

默认情况下,操作符将设置为 >=,您可以将操作符传递给函数以应用于过滤器。

$filterManager->addHasFilter(string $relationName, string $operator);

默认情况下,应用过滤器时,此 Where 过滤器的值将从与列名相同的键的过滤数据中获取,您可以将不同的键传递给函数以将值应用于过滤器。

$filterManager->addHasFilter(string $relationName, string $operator, string $valueKey);
  • 添加 Where Between 过滤器 有四种方式使用此函数。

    • 第一种方式
    $filtersData = [
         $column => ['value1','value2'],
    ];
    $filterManager->addWhereBetweenFilter(string $column);
    • 第二种方式
    $filtersData = [
         $valueKey => ['value1','value2'],
    ];
    $filterManager->addWhereBetweenFilter(string $column, string $valueKey);
    • 第三种方式
    $filtersData = [
       'valueKey1' => 'value1',
       'valueKey2' => 'value2',
    ];
    $filterManager->addWhereBetweenFilter(string $column, ['valueKey1','valueKey2']);
    • 第四种方式 如果您有不同的逻辑来应用 Where Between 过滤器,可以将回调传递给函数以将逻辑应用于过滤器。
    $callback = function(): array {};
    $filterManager->addWhereBetweenFilter(string $column, Closure $callback);
    • 添加 Where Not Between 过滤器 有四种方式使用此函数。

      • 第一种方式
      $filtersData = [
         $column => ['value1','value2'],
      ];
      $filterManager->addWhereBetweenFilter(string $column);
      • 第二种方式
      $filtersData = [
         $valueKey => ['value1','value2'],
      ];
      $filterManager->addWhereBetweenFilter(string $column, string $valueKey);
      • 第三种方式
      $filtersData = [
         'valueKey1' => 'value1',
         'valueKey2' => 'value2',
      ];
      $filterManager->addWhereBetweenFilter(string $column, ['valueKey1','valueKey2']);
      • 第四种方式

      如果您有不同的逻辑来应用 Where Between 过滤器,可以将回调传递给函数以将逻辑应用于过滤器。

      $callback = function(): array {};
      $filterManager->addWhereBetweenFilter(string $column, Closure $callback);
  • 添加 Where Function 过滤器

$filterManager->addWhereFunctionFilter(Closure $callback, string $filterKey);

$filterKey 是将用于检查是否应用此过滤器的键。

  • 添加多个 Where 过滤器
$columns = [
   'column1',
   'column2' => 'valueKey',
   'column3'
];
$filterManager->addMultipleWhereFilter(array $columns);

默认情况下,操作符将设置为 =,您可以将操作符传递给函数以应用于过滤器。

$filterManager->addMultipleWhereFilter(array $columns, string $operator);
  • 添加多个 Where In 过滤器
$columns = [
   'column1',
   'column2' => 'valueKey',
   'column3'
];
$filterManager->addMultipleWhereInFilter(array $columns);
  • 添加多个 Where Not In 过滤器
$columns = [
   'column1',
   'column2' => 'valueKey',
   'column3'
];
$filterManager->addMultipleWhereNotInFilter(array $columns);
  • 添加多个 Where Has 过滤器 [注意:您不能与集合或数组数据一起使用此函数。]
$relations = [
   'relation1' => function($query){},
   'relation2' => function($query){},
   'relation3' => function($query){}
];
$filterManager->addMultipleWhereHasFilter(array $relations);
  • 添加多个 Has 过滤器
$relations = [
   'relation1',
   'relation2' => 'valueKey',
   'relation3'
];
$filterManager->addMultipleHasFilter(array $relations);

默认情况下,操作符将设置为 >=,您可以将操作符传递给函数以应用于过滤器。

$filterManager->addMultipleHasFilter(array $relations, string $operator);
  • 添加多个 Where Between 过滤器
$data = [
   'column1',
   'column2' => 'valueKey',
   'column3' => ['valueKey1', 'valueKey2'],
   'column4' => functioin(): array {}
];
$filterManager->addMultipleWhereBetweenFilter(array $data);
  • 添加多个 Where Not Between 过滤器
$data = [
   'column1',
   'column2' => 'valueKey',
   'column3' => ['valueKey1', 'valueKey2'],
   'column4' => functioin(): array {}
];
$filterManager->addMultipleWhereNotBetweenFilter(array $data);

应用过滤器

现在您可以简单地从 $filterManager 对象调用函数 applyFilters

$filterManager->applyFilters(Relation|Builder|Collection|array &$data)

然后您的数据将被过滤。

示例

use DD\MicroserviceCore\Classes\FilterManager;
use DD\MicroserviceCore\Interfaces\ServiceInterface;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\Collection;

class ModelService implements ServiceInterface
{

   /**
   * @inheritDoc
   */
   public function applyFilters(Relation|Builder|array|Collection &$data, ?array $filtersData = null): void
   {
      $filterManager = new FilterManager($filtersData);

      $filterManager->addMultipleWhereFilter(['name', 'email' => 'mail'], 'LIKE');
      $filterManager->addWhereInFilter('id');

      $filterManager->applyFilters($data);
   }
}

日志记录

use DD\MicroserviceCore\Classes\Logging

日志类型

  • 紧急
  • 警报
  • 关键
  • 错误
  • 警告
  • 通知
  • 信息
  • 调试

函数

对于每种类型都有一个静态函数来处理,所有函数都有两个参数:string $messagearray $context = []

Logging::emergency(string $message, array $context);
Logging::alert(string $message, array $context);
Logging::critical(string $message, array $context);
Logging::error(string $message, array $context);
Logging::warning(string $message, array $context);
Logging::notice(string $message, array $context);
Logging::info(string $message, array $context);
Logging::debug(string $message, array $context);

表单请求

扩展了DD\MicroserviceCore\Abstracts\ApiFormRequest抽象类。

use DD\MicroserviceCore\Abstracts\ApiFormRequest;
class YourRequestForm extends ApiFormRequest
{}