laravel-api-response - 規範化和標準化 Laravel API 響應資料結構
laravel-api-response - 規範化和標準化 Laravel API 響應資料結構。
原始碼
guanguans/laravel-api-response
功能
- 支援自定義響應資料結構
- 支援 restful 介面響應(可選)
- 支援自動處理 api 異常
- 支援本地化訊息
- 支援自定義管道(透過管道處理 api 響應結構)
- 支援自定義異常管道(透過管道將異常轉換為 api 響應)
環境要求
- PHP >= 7.4
- Laravel >= 8.83
安裝
composer require guanguans/laravel-api-response --ansi -v
配置
釋出檔案(可選)
php artisan vendor:publish --provider="Guanguans\\LaravelApiResponse\\ServiceProvider" --ansi -v
使用
快速開始
<details>
<summary>詳情</summary>
<?php
namespace App\Http\Controllers\Api;
use Guanguans\LaravelApiResponse\Contracts\ApiResponseContract;
use Guanguans\LaravelApiResponse\Facades\ApiResponseFacade;
use Guanguans\LaravelApiResponse\Middleware\SetAcceptHeader;
use Guanguans\LaravelApiResponse\Support\Traits\ApiResponseFactory;
use Illuminate\Http\JsonResponse;
class Controller extends \App\Http\Controllers\Controller
{
use ApiResponseFactory;
public function __construct()
{
$this->middleware(SetAcceptHeader::class)->only('exceptionHandler');
}
public function getInstance(): JsonResponse
{
/** @var \Guanguans\LaravelApiResponse\ApiResponse $apiResponse */
// $apiResponse = ApiResponseFacade::getFacadeRoot();
// $apiResponse = resolve(ApiResponseContract::class);
// $apiResponse = app(ApiResponseContract::class);
$apiResponse = $this->apiResponse();
return $apiResponse->success($data);
}
public function exampleMethods(): JsonResponse
{
// return $this->apiResponse()->error($message);
// return $this->apiResponse()->exception($exception);
return $this->apiResponse()->success($data);
}
/**
* @response
*
* ```json
* {
* "status": false,
* "code": 500,
* "message": "This is a runtime exception.",
* "data": {},
* "error": {
* "message": "This is a runtime exception.",
* "exception": "RuntimeException",
* ...
* "trace": [
* ...
* ]
* }
* }
* ```
*/
public function exceptionHandler(): JsonResponse
{
config()->set('app.debug', true);
throw new \RuntimeException('This is a runtime exception.');
}
}
</details>
預設響應結構
<details>
<summary>詳情</summary>
{
"status": "boolean",
"code": "integer",
"message": "string",
"data": "mixed",
"error": "object"
}
</details>
預設響應示例
<details>
<summary>model</summary>
<?php
namespace App\Http\Controllers\Api;
use Guanguans\LaravelApiResponse\Support\Traits\ApiResponseFactory;
use Guanguans\LaravelApiResponse\Tests\Laravel\Models\User;
use Illuminate\Http\JsonResponse;
class Controller extends \App\Http\Controllers\Controller
{
use ApiResponseFactory;
public function example(): JsonResponse
{
$user = User::query()->with(['country', 'posts'])->first();
return $this->apiResponse()->success($user);
}
}
{
"status": true,
"code": 200,
"message": "OK",
"data": {
"id": 1,
"name": "John",
"country_id": 1,
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01",
"country": {
"id": 1,
"name": "China",
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01"
},
"posts": [
{
"id": 1,
"title": "PHP is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01"
},
{
"id": 2,
"title": "JAVA is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:02",
"updated_at": "2024-01-01 00:00:02"
},
{
"id": 3,
"title": "Python is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:03",
"updated_at": "2024-01-01 00:00:03"
}
]
},
"error": {}
}
</details>
<details>
<summary>eloquent collection</summary>
<?php
namespace App\Http\Controllers\Api;
use Guanguans\LaravelApiResponse\Support\Traits\ApiResponseFactory;
use Guanguans\LaravelApiResponse\Tests\Laravel\Models\User;
use Illuminate\Http\JsonResponse;
class Controller extends \App\Http\Controllers\Controller
{
use ApiResponseFactory;
public function example(): JsonResponse
{
$users = User::query()->with(['country', 'posts'])->get();
return $this->apiResponse()->success($users);
}
}
{
"status": true,
"code": 200,
"message": "OK",
"data": [
{
"id": 1,
"name": "John",
"country_id": 1,
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01",
"country": {
"id": 1,
"name": "China",
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01"
},
"posts": [
{
"id": 1,
"title": "PHP is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01"
},
{
"id": 2,
"title": "JAVA is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:02",
"updated_at": "2024-01-01 00:00:02"
},
{
"id": 3,
"title": "Python is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:03",
"updated_at": "2024-01-01 00:00:03"
}
]
},
{
"id": 2,
"name": "Tom",
"country_id": 2,
"created_at": "2024-01-01 00:00:02",
"updated_at": "2024-01-01 00:00:02",
"country": {
"id": 2,
"name": "USA",
"created_at": "2024-01-01 00:00:02",
"updated_at": "2024-01-01 00:00:02"
},
"posts": [
{
"id": 4,
"title": "Go is the best language!",
"user_id": 2,
"created_at": "2024-01-01 00:00:04",
"updated_at": "2024-01-01 00:00:04"
},
{
"id": 5,
"title": "JavaScript is the best language!",
"user_id": 2,
"created_at": "2024-01-01 00:00:05",
"updated_at": "2024-01-01 00:00:05"
},
{
"id": 6,
"title": "Ruby is the best language!",
"user_id": 2,
"created_at": "2024-01-01 00:00:06",
"updated_at": "2024-01-01 00:00:06"
}
]
},
{
"id": 3,
"name": "Jerry",
"country_id": 3,
"created_at": "2024-01-01 00:00:03",
"updated_at": "2024-01-01 00:00:03",
"country": {
"id": 3,
"name": "Japan",
"created_at": "2024-01-01 00:00:03",
"updated_at": "2024-01-01 00:00:03"
},
"posts": [
{
"id": 7,
"title": "C is the best language!",
"user_id": 3,
"created_at": "2024-01-01 00:00:07",
"updated_at": "2024-01-01 00:00:07"
}
]
},
{
"id": 4,
"name": "Jack",
"country_id": 4,
"created_at": "2024-01-01 00:00:04",
"updated_at": "2024-01-01 00:00:04",
"country": {
"id": 4,
"name": "Korea",
"created_at": "2024-01-01 00:00:04",
"updated_at": "2024-01-01 00:00:04"
},
"posts": []
},
{
"id": 5,
"name": "Rose",
"country_id": 5,
"created_at": "2024-01-01 00:00:05",
"updated_at": "2024-01-01 00:00:05",
"country": {
"id": 5,
"name": "UK",
"created_at": "2024-01-01 00:00:05",
"updated_at": "2024-01-01 00:00:05"
},
"posts": []
},
{
"id": 6,
"name": "Lucy",
"country_id": 6,
"created_at": "2024-01-01 00:00:06",
"updated_at": "2024-01-01 00:00:06",
"country": {
"id": 6,
"name": "France",
"created_at": "2024-01-01 00:00:06",
"updated_at": "2024-01-01 00:00:06"
},
"posts": []
},
{
"id": 7,
"name": "Lily",
"country_id": 7,
"created_at": "2024-01-01 00:00:07",
"updated_at": "2024-01-01 00:00:07",
"country": {
"id": 7,
"name": "Germany",
"created_at": "2024-01-01 00:00:07",
"updated_at": "2024-01-01 00:00:07"
},
"posts": []
}
],
"error": {}
}
</details>
<details>
<summary>simple paginate</summary>
<?php
namespace App\Http\Controllers\Api;
use Guanguans\LaravelApiResponse\Support\Traits\ApiResponseFactory;
use Guanguans\LaravelApiResponse\Tests\Laravel\Models\User;
use Illuminate\Http\JsonResponse;
class Controller extends \App\Http\Controllers\Controller
{
use ApiResponseFactory;
public function example(): JsonResponse
{
$simplePaginate = User::query()->with(['country', 'posts'])->simplePaginate(3);
return $this->apiResponse()->success($simplePaginate);
}
}
{
"status": true,
"code": 200,
"message": "OK",
"data": {
"data": [
{
"id": 1,
"name": "John",
"country_id": 1,
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01",
"country": {
"id": 1,
"name": "China",
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01"
},
"posts": [
{
"id": 1,
"title": "PHP is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01"
},
{
"id": 2,
"title": "JAVA is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:02",
"updated_at": "2024-01-01 00:00:02"
},
{
"id": 3,
"title": "Python is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:03",
"updated_at": "2024-01-01 00:00:03"
}
]
},
{
"id": 2,
"name": "Tom",
"country_id": 2,
"created_at": "2024-01-01 00:00:02",
"updated_at": "2024-01-01 00:00:02",
"country": {
"id": 2,
"name": "USA",
"created_at": "2024-01-01 00:00:02",
"updated_at": "2024-01-01 00:00:02"
},
"posts": [
{
"id": 4,
"title": "Go is the best language!",
"user_id": 2,
"created_at": "2024-01-01 00:00:04",
"updated_at": "2024-01-01 00:00:04"
},
{
"id": 5,
"title": "JavaScript is the best language!",
"user_id": 2,
"created_at": "2024-01-01 00:00:05",
"updated_at": "2024-01-01 00:00:05"
},
{
"id": 6,
"title": "Ruby is the best language!",
"user_id": 2,
"created_at": "2024-01-01 00:00:06",
"updated_at": "2024-01-01 00:00:06"
}
]
},
{
"id": 3,
"name": "Jerry",
"country_id": 3,
"created_at": "2024-01-01 00:00:03",
"updated_at": "2024-01-01 00:00:03",
"country": {
"id": 3,
"name": "Japan",
"created_at": "2024-01-01 00:00:03",
"updated_at": "2024-01-01 00:00:03"
},
"posts": [
{
"id": 7,
"title": "C is the best language!",
"user_id": 3,
"created_at": "2024-01-01 00:00:07",
"updated_at": "2024-01-01 00:00:07"
}
]
}
],
"links": {
"first": "http:\/\/localhost?page=1",
"last": null,
"prev": null,
"next": "http:\/\/localhost?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"path": "http:\/\/localhost",
"per_page": 3,
"to": 3
}
},
"error": {}
}
</details>
<details>
<summary>resource</summary>
<?php
namespace App\Http\Controllers\Api;
use Guanguans\LaravelApiResponse\Support\Traits\ApiResponseFactory;
use Guanguans\LaravelApiResponse\Tests\Laravel\Models\User;
use Guanguans\LaravelApiResponse\Tests\Laravel\Resources\UserResource;
use Illuminate\Http\JsonResponse;
class Controller extends \App\Http\Controllers\Controller
{
use ApiResponseFactory;
public function example(): JsonResponse
{
$userResource = UserResource::make(User::query()->with(['country', 'posts'])->first());
return $this->apiResponse()->success($userResource);
}
}
{
"status": true,
"code": 200,
"message": "OK",
"data": {
"id": 1,
"name": "John",
"country_id": 1,
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01",
"country": {
"id": 1,
"name": "China",
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01"
},
"posts": [
{
"id": 1,
"title": "PHP is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01"
},
{
"id": 2,
"title": "JAVA is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:02",
"updated_at": "2024-01-01 00:00:02"
},
{
"id": 3,
"title": "Python is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:03",
"updated_at": "2024-01-01 00:00:03"
}
]
},
"error": {}
}
</details>
<details>
<summary>resource collection</summary>
<?php
namespace App\Http\Controllers\Api;
use Guanguans\LaravelApiResponse\Support\Traits\ApiResponseFactory;
use Guanguans\LaravelApiResponse\Tests\Laravel\Models\User;
use Guanguans\LaravelApiResponse\Tests\Laravel\Resources\UserCollection;
use Illuminate\Http\JsonResponse;
class Controller extends \App\Http\Controllers\Controller
{
use ApiResponseFactory;
public function example(): JsonResponse
{
$userCollection = UserCollection::make(User::query()->with(['country', 'posts'])->get());
return $this->apiResponse()->success($userCollection);
}
}
{
"status": true,
"code": 200,
"message": "OK",
"data": {
"data": [
{
"id": 1,
"name": "John",
"country_id": 1,
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01",
"country": {
"id": 1,
"name": "China",
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01"
},
"posts": [
{
"id": 1,
"title": "PHP is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:01",
"updated_at": "2024-01-01 00:00:01"
},
{
"id": 2,
"title": "JAVA is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:02",
"updated_at": "2024-01-01 00:00:02"
},
{
"id": 3,
"title": "Python is the best language!",
"user_id": 1,
"created_at": "2024-01-01 00:00:03",
"updated_at": "2024-01-01 00:00:03"
}
]
},
{
"id": 2,
"name": "Tom",
"country_id": 2,
"created_at": "2024-01-01 00:00:02",
"updated_at": "2024-01-01 00:00:02",
"country": {
"id": 2,
"name": "USA",
"created_at": "2024-01-01 00:00:02",
"updated_at": "2024-01-01 00:00:02"
},
"posts": [
{
"id": 4,
"title": "Go is the best language!",
"user_id": 2,
"created_at": "2024-01-01 00:00:04",
"updated_at": "2024-01-01 00:00:04"
},
{
"id": 5,
"title": "JavaScript is the best language!",
"user_id": 2,
"created_at": "2024-01-01 00:00:05",
"updated_at": "2024-01-01 00:00:05"
},
{
"id": 6,
"title": "Ruby is the best language!",
"user_id": 2,
"created_at": "2024-01-01 00:00:06",
"updated_at": "2024-01-01 00:00:06"
}
]
},
{
"id": 3,
"name": "Jerry",
"country_id": 3,
"created_at": "2024-01-01 00:00:03",
"updated_at": "2024-01-01 00:00:03",
"country": {
"id": 3,
"name": "Japan",
"created_at": "2024-01-01 00:00:03",
"updated_at": "2024-01-01 00:00:03"
},
"posts": [
{
"id": 7,
"title": "C is the best language!",
"user_id": 3,
"created_at": "2024-01-01 00:00:07",
"updated_at": "2024-01-01 00:00:07"
}
]
},
{
"id": 4,
"name": "Jack",
"country_id": 4,
"created_at": "2024-01-01 00:00:04",
"updated_at": "2024-01-01 00:00:04",
"country": {
"id": 4,
"name": "Korea",
"created_at": "2024-01-01 00:00:04",
"updated_at": "2024-01-01 00:00:04"
},
"posts": []
},
{
"id": 5,
"name": "Rose",
"country_id": 5,
"created_at": "2024-01-01 00:00:05",
"updated_at": "2024-01-01 00:00:05",
"country": {
"id": 5,
"name": "UK",
"created_at": "2024-01-01 00:00:05",
"updated_at": "2024-01-01 00:00:05"
},
"posts": []
},
{
"id": 6,
"name": "Lucy",
"country_id": 6,
"created_at": "2024-01-01 00:00:06",
"updated_at": "2024-01-01 00:00:06",
"country": {
"id": 6,
"name": "France",
"created_at": "2024-01-01 00:00:06",
"updated_at": "2024-01-01 00:00:06"
},
"posts": []
},
{
"id": 7,
"name": "Lily",
"country_id": 7,
"created_at": "2024-01-01 00:00:07",
"updated_at": "2024-01-01 00:00:07",
"country": {
"id": 7,
"name": "Germany",
"created_at": "2024-01-01 00:00:07",
"updated_at": "2024-01-01 00:00:07"
},
"posts": []
}
]
},
"error": {}
}
</details>
<details>
<summary>error</summary>
<?php
namespace App\Http\Controllers\Api;
use Guanguans\LaravelApiResponse\Support\Traits\ApiResponseFactory;
use Illuminate\Http\JsonResponse;
class Controller extends \App\Http\Controllers\Controller
{
use ApiResponseFactory;
public function example(): JsonResponse
{
return $this->apiResponse()->error('This is an error.');
}
}
{
"status": false,
"code": 400,
"message": "This is an error.",
"data": {},
"error": {}
}
</details>
<details>
<summary>exception</summary>
<?php
namespace App\Http\Controllers\Api;
use Guanguans\LaravelApiResponse\Support\Traits\ApiResponseFactory;
use Illuminate\Http\JsonResponse;
class Controller extends \App\Http\Controllers\Controller
{
use ApiResponseFactory;
public function example(): JsonResponse
{
config()->set('app.debug', false);
$runtimeException = new \RuntimeException('This is a runtime exception.');
return $this->apiResponse()->exception($runtimeException);
}
}
{
"status": false,
"code": 500,
"message": "Internal Server Error",
"data": {},
"error": {
"message": "Server Error"
}
}
</details>
<details>
<summary>debug exception</summary>
<?php
namespace App\Http\Controllers\Api;
use Guanguans\LaravelApiResponse\Support\Traits\ApiResponseFactory;
use Illuminate\Http\JsonResponse;
class Controller extends \App\Http\Controllers\Controller
{
use ApiResponseFactory;
public function example(): JsonResponse
{
config()->set('app.debug', true);
$runtimeException = new \RuntimeException('This is a runtime exception.');
return $this->apiResponse()->exception($runtimeException);
}
}
{
"status": false,
"code": 500,
"message": "This is a runtime exception.",
"data": {},
"error": {
"message": "This is a runtime exception.",
"exception": "RuntimeException",
"file": "\/tests\/Feature\/ExceptionDataTypesTest.php",
"line": 45,
"trace": [
{
"function": "{closure}",
"class": "P\\Tests\\Feature\\ExceptionDataTypesTest",
"type": "->"
},
{
"file": "\/vendor\/pestphp\/pest\/src\/Factories\/TestCaseFactory.php",
"line": 151,
"function": "call_user_func"
},
{
"function": "Pest\\Factories\\{closure}",
"class": "P\\Tests\\Feature\\ExceptionDataTypesTest",
"type": "->"
},
{
"file": "\/vendor\/pestphp\/pest\/src\/Concerns\/Testable.php",
"line": 301,
"function": "call_user_func_array"
},
{
"file": "\/vendor\/pestphp\/pest\/src\/Support\/ExceptionTrace.php",
"line": 29,
"function": "Pest\\Concerns\\{closure}",
"class": "P\\Tests\\Feature\\ExceptionDataTypesTest",
"type": "->"
},
{
"file": "\/vendor\/pestphp\/pest\/src\/Concerns\/Testable.php",
"line": 302,
"function": "ensure",
"class": "Pest\\Support\\ExceptionTrace",
"type": "::"
},
{
"file": "\/vendor\/pestphp\/pest\/src\/Concerns\/Testable.php",
"line": 278,
"function": "__callClosure",
"class": "P\\Tests\\Feature\\ExceptionDataTypesTest",
"type": "->"
},
{
"file": "\/vendor\/phpunit\/phpunit\/src\/Framework\/TestCase.php",
"line": 1617,
"function": "__test",
"class": "P\\Tests\\Feature\\ExceptionDataTypesTest",
"type": "->"
},
{
"file": "\/vendor\/phpunit\/phpunit\/src\/Framework\/TestCase.php",
"line": 1223,
"function": "runTest",
"class": "PHPUnit\\Framework\\TestCase",
"type": "->"
},
{
"file": "\/vendor\/phpunit\/phpunit\/src\/Framework\/TestResult.php",
"line": 729,
"function": "runBare",
"class": "PHPUnit\\Framework\\TestCase",
"type": "->"
},
{
"file": "\/vendor\/phpunit\/phpunit\/src\/Framework\/TestCase.php",
"line": 973,
"function": "run",
"class": "PHPUnit\\Framework\\TestResult",
"type": "->"
},
{
"file": "\/vendor\/phpunit\/phpunit\/src\/Framework\/TestSuite.php",
"line": 685,
"function": "run",
"class": "PHPUnit\\Framework\\TestCase",
"type": "->"
},
{
"file": "\/vendor\/phpunit\/phpunit\/src\/Framework\/TestSuite.php",
"line": 685,
"function": "run",
"class": "PHPUnit\\Framework\\TestSuite",
"type": "->"
},
{
"file": "\/vendor\/phpunit\/phpunit\/src\/TextUI\/TestRunner.php",
"line": 651,
"function": "run",
"class": "PHPUnit\\Framework\\TestSuite",
"type": "->"
},
{
"file": "\/vendor\/phpunit\/phpunit\/src\/TextUI\/Command.php",
"line": 146,
"function": "run",
"class": "PHPUnit\\TextUI\\TestRunner",
"type": "->"
},
{
"file": "\/vendor\/pestphp\/pest\/src\/Console\/Command.php",
"line": 119,
"function": "run",
"class": "PHPUnit\\TextUI\\Command",
"type": "->"
},
{
"file": "\/vendor\/pestphp\/pest\/bin\/pest",
"line": 61,
"function": "run",
"class": "Pest\\Console\\Command",
"type": "->"
},
{
"file": "\/vendor\/pestphp\/pest\/bin\/pest",
"line": 62,
"function": "{closure}"
},
{
"file": "\/vendor\/bin\/pest",
"line": 115,
"function": "include"
}
]
}
}
</details>
<details>
<summary>exception handler</summary>
<?php
namespace App\Http\Controllers\Api;
use Guanguans\LaravelApiResponse\Middleware\SetAcceptHeader;
use Illuminate\Http\JsonResponse;
class Controller extends \App\Http\Controllers\Controller
{
public function __construct()
{
$this->middleware(SetAcceptHeader::class)->only('example');
}
public function example(): JsonResponse
{
config()->set('app.debug', false);
throw new \RuntimeException('This is a runtime exception.');
}
}
{
"status": false,
"code": 500,
"message": "Internal Server Error",
"data": {},
"error": {
"message": "Server Error"
}
}
</details>
<details>
<summary>locale exception</summary>
<?php
namespace App\Http\Controllers\Api;
use Guanguans\LaravelApiResponse\Support\Traits\ApiResponseFactory;
use Illuminate\Http\JsonResponse;
class Controller extends \App\Http\Controllers\Controller
{
use ApiResponseFactory;
public function example(): JsonResponse
{
config()->set('app.debug', false);
config()->set('app.locale', 'zh_CN');
$runtimeException = new \RuntimeException('This is a runtime exception.');
return $this->apiResponse()->exception($runtimeException);
}
}
{
"status": false,
"code": 500,
"message": "內部伺服器錯誤",
"data": {},
"error": {
"message": "Server Error"
}
}
</details>
<details>
<summary>更多例子...</summary>
- 功能測試
- 示例結果
</details>
FAQ
<details>
<summary>如何自定義管道</summary>
- 參考 Pipes
- 簡單示例:
<?php
static function (array $data, \Closure $next): JsonResponse {
if ($data['data'] instanceof \iterable) {
$data['data'] = iterator_to_array($data['data']);
}
return $next($data);
};
</details>
<details>
<summary>如何自定義異常管道</summary>
- 參考 ExceptionPipes
</details>
<details>
<summary>如何在單個 api 中自定義管道</summary>
- 參考 HasPipes.php、HasExceptionPipes.php
- 簡單示例:
<?php
namespace App\Http\Controllers\Api;
use Guanguans\LaravelApiResponse\Support\Traits\ApiResponseFactory;
use Illuminate\Http\JsonResponse;
class Controller extends \App\Http\Controllers\Controller
{
use ApiResponseFactory;
public function example(): JsonResponse
{
return $this
->apiResponse()
// ->unshiftPipes(...)
->pushPipes(
static function (array $data, \Closure $next): JsonResponse {
if ($data['data'] instanceof \iterable) {
$data['data'] = iterator_to_array($data['data']);
}
return $next($data);
}
)
// ->unshiftExceptionPipes(...)
// ->pushExceptionPipes(...)
->success($iterator);
}
}
</details>
<details>
<summary>如何始終以成功的 http 狀態程式碼進行響應</summary>
- 參考 StatusCodePipe.php
- 刪除該配置
api-response.pipes.StatusCodePipe
</details>
<details>
<summary>如何本地化訊息</summary>
- 參考 MessagePipe.php
- 安裝 Laravel-Lang/http-statuses
composer require --dev laravel-lang/http-statuses
或建立語言檔案resources/lang/***/http-statuses.php
</details>
<details>
<summary>http 狀態的快捷方法</summary>
- 參考 ConcreteHttpStatus.php
</details>
參考專案
- dingo/api
- f9webltd/laravel-api-response-helpers
- flugg/laravel-responder
- jiannei/laravel-response
- MarcinOrlowski/laravel-api-response-builder
原文連線
- https://github.com/guanguans/guanguans.github.io/issues/58