{"id":18010799,"url":"https://github.com/guanguans/laravel-api-response","last_synced_at":"2025-03-26T14:32:11.109Z","repository":{"id":254084400,"uuid":"845426201","full_name":"guanguans/laravel-api-response","owner":"guanguans","description":"Normalize and standardize Laravel API response data structures. - 规范化和标准化 Laravel API 响应数据结构。","archived":false,"fork":false,"pushed_at":"2025-03-08T09:59:50.000Z","size":489,"stargazers_count":33,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-18T07:47:50.804Z","etag":null,"topics":["api","data","json","laravel","normalize","response","rest","restful","standardize","structure"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/guanguans.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"patreon":"guanguans","custom":"https://www.guanguans.cn/images/wechat.jpeg"}},"created_at":"2024-08-21T08:21:21.000Z","updated_at":"2025-03-18T07:01:19.000Z","dependencies_parsed_at":null,"dependency_job_id":"3eec6cc3-fe66-46bb-b368-d809a55e65fd","html_url":"https://github.com/guanguans/laravel-api-response","commit_stats":null,"previous_names":["guanguans/laravel-api-response"],"tags_count":25,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanguans%2Flaravel-api-response","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanguans%2Flaravel-api-response/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanguans%2Flaravel-api-response/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanguans%2Flaravel-api-response/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/guanguans","download_url":"https://codeload.github.com/guanguans/laravel-api-response/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245670875,"owners_count":20653443,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","data","json","laravel","normalize","response","rest","restful","standardize","structure"],"created_at":"2024-10-30T02:15:22.883Z","updated_at":"2025-03-26T14:32:10.731Z","avatar_url":"https://github.com/guanguans.png","language":"PHP","funding_links":["https://patreon.com/guanguans","https://www.guanguans.cn/images/wechat.jpeg"],"categories":[],"sub_categories":[],"readme":"# laravel-api-response\n\n\u003e Normalize and standardize Laravel API response data structures. - 规范化和标准化 Laravel API 响应数据结构。\n\n[![tests](https://github.com/guanguans/laravel-api-response/workflows/tests/badge.svg)](https://github.com/guanguans/laravel-api-response/actions)\n[![check \u0026 fix styling](https://github.com/guanguans/laravel-api-response/workflows/check%20\u0026%20fix%20styling/badge.svg)](https://github.com/guanguans/laravel-api-response/actions)\n[![codecov](https://codecov.io/gh/guanguans/laravel-api-response/branch/main/graph/badge.svg?token=URGFAWS6S4)](https://codecov.io/gh/guanguans/laravel-api-response)\n[![Latest Stable Version](https://poser.pugx.org/guanguans/laravel-api-response/v)](https://packagist.org/packages/guanguans/laravel-api-response)\n[![GitHub release (with filter)](https://img.shields.io/github/v/release/guanguans/laravel-api-response)](https://github.com/guanguans/laravel-api-response/releases)\n[![Total Downloads](https://poser.pugx.org/guanguans/laravel-api-response/downloads)](https://packagist.org/packages/guanguans/laravel-api-response)\n[![License](https://poser.pugx.org/guanguans/laravel-api-response/license)](https://packagist.org/packages/guanguans/laravel-api-response)\n\n## Features\n\n* Support for customized response data structure\n* Support for restful API response(optional)\n* Support for automatically handled api exception\n* Support for localized message\n* Support for customized pipe(Pipeline processing of the whole response)\n* Support for customized exception pipe(Pipeline processing exception response)\n\n## Requirement\n\n* PHP \u003e= 7.4\n\n## Installation\n\n```shell\ncomposer require guanguans/laravel-api-response --ansi -v\n```\n\n## Configuration\n\n### Publish files(optional)\n\n```shell\nphp artisan vendor:publish --provider=\"Guanguans\\\\LaravelApiResponse\\\\ServiceProvider\" --ansi -v\n```\n\n## Usage\n\n### Quick start\n\n\u003cdetails\u003e\n\u003csummary\u003edetails\u003c/summary\u003e\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse Guanguans\\LaravelApiResponse\\Contracts\\ApiResponseContract;\nuse Guanguans\\LaravelApiResponse\\Facades\\ApiResponseFacade;\nuse Guanguans\\LaravelApiResponse\\Middleware\\SetAcceptHeader;\nuse Guanguans\\LaravelApiResponse\\Support\\Traits\\ApiResponseFactory;\nuse Illuminate\\Http\\JsonResponse;\n\nclass Controller extends \\App\\Http\\Controllers\\Controller\n{\n    use ApiResponseFactory;\n\n    public function __construct()\n    {\n        $this-\u003emiddleware(SetAcceptHeader::class)-\u003eonly('exceptionHandler');\n    }\n\n    public function getInstance(): JsonResponse\n    {\n        /** @var \\Guanguans\\LaravelApiResponse\\ApiResponse $apiResponse */\n        // $apiResponse = ApiResponseFacade::getFacadeRoot();\n        // $apiResponse = resolve(ApiResponseContract::class);\n        // $apiResponse = app(ApiResponseContract::class);\n        $apiResponse = $this-\u003eapiResponse();\n\n        return $apiResponse-\u003esuccess($data);\n    }\n\n    public function exampleMethods(): JsonResponse\n    {\n        // return $this-\u003eapiResponse()-\u003eerror($message);\n        // return $this-\u003eapiResponse()-\u003eexception($exception);\n        return $this-\u003eapiResponse()-\u003esuccess($data);\n    }\n\n    /**\n     * @response\n     *\n     * ```json\n     * {\n     *     \"status\": false,\n     *     \"code\": 500,\n     *     \"message\": \"This is a runtime exception.\",\n     *     \"data\": {},\n     *     \"error\": {\n     *         \"message\": \"This is a runtime exception.\",\n     *         \"exception\": \"RuntimeException\",\n     *         ...\n     *         \"trace\": [\n     *             ...\n     *         ]\n     *     }\n     * }\n     * ```\n     */\n    public function exceptionHandler(): JsonResponse\n    {\n        config()-\u003eset('app.debug', true);\n\n        throw new \\RuntimeException('This is a runtime exception.');\n    }\n}\n```\n\n\u003c/details\u003e\n\n### Default response structure\n\n\u003cdetails\u003e\n\u003csummary\u003edetails\u003c/summary\u003e\n\n```json\n{\n    \"status\": \"boolean\",\n    \"code\": \"integer\",\n    \"message\": \"string\",\n    \"data\": \"mixed\",\n    \"error\": \"object\"\n}\n```\n\n\u003c/details\u003e\n\n### Default response examples\n\n\u003cdetails\u003e\n\u003csummary\u003emodel\u003c/summary\u003e\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse Guanguans\\LaravelApiResponse\\Support\\Traits\\ApiResponseFactory;\nuse Guanguans\\LaravelApiResponse\\Tests\\Laravel\\Models\\User;\nuse Illuminate\\Http\\JsonResponse;\n\nclass Controller extends \\App\\Http\\Controllers\\Controller\n{\n    use ApiResponseFactory;\n\n    public function example(): JsonResponse\n    {\n        $user = User::query()-\u003ewith(['country', 'posts'])-\u003efirst();\n\n        return $this-\u003eapiResponse()-\u003esuccess($user);\n    }\n}\n```\n\n```json\n{\n    \"status\": true,\n    \"code\": 200,\n    \"message\": \"OK\",\n    \"data\": {\n        \"id\": 1,\n        \"name\": \"John\",\n        \"country_id\": 1,\n        \"created_at\": \"2024-01-01 00:00:01\",\n        \"updated_at\": \"2024-01-01 00:00:01\",\n        \"country\": {\n            \"id\": 1,\n            \"name\": \"China\",\n            \"created_at\": \"2024-01-01 00:00:01\",\n            \"updated_at\": \"2024-01-01 00:00:01\"\n        },\n        \"posts\": [\n            {\n                \"id\": 1,\n                \"title\": \"PHP is the best language!\",\n                \"user_id\": 1,\n                \"created_at\": \"2024-01-01 00:00:01\",\n                \"updated_at\": \"2024-01-01 00:00:01\"\n            },\n            {\n                \"id\": 2,\n                \"title\": \"JAVA is the best language!\",\n                \"user_id\": 1,\n                \"created_at\": \"2024-01-01 00:00:02\",\n                \"updated_at\": \"2024-01-01 00:00:02\"\n            },\n            {\n                \"id\": 3,\n                \"title\": \"Python is the best language!\",\n                \"user_id\": 1,\n                \"created_at\": \"2024-01-01 00:00:03\",\n                \"updated_at\": \"2024-01-01 00:00:03\"\n            }\n        ]\n    },\n    \"error\": {}\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eeloquent collection\u003c/summary\u003e\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse Guanguans\\LaravelApiResponse\\Support\\Traits\\ApiResponseFactory;\nuse Guanguans\\LaravelApiResponse\\Tests\\Laravel\\Models\\User;\nuse Illuminate\\Http\\JsonResponse;\n\nclass Controller extends \\App\\Http\\Controllers\\Controller\n{\n    use ApiResponseFactory;\n\n    public function example(): JsonResponse\n    {\n        $users = User::query()-\u003ewith(['country', 'posts'])-\u003eget();\n\n        return $this-\u003eapiResponse()-\u003esuccess($users);\n    }\n}\n```\n\n```json\n{\n    \"status\": true,\n    \"code\": 200,\n    \"message\": \"OK\",\n    \"data\": [\n        {\n            \"id\": 1,\n            \"name\": \"John\",\n            \"country_id\": 1,\n            \"created_at\": \"2024-01-01 00:00:01\",\n            \"updated_at\": \"2024-01-01 00:00:01\",\n            \"country\": {\n                \"id\": 1,\n                \"name\": \"China\",\n                \"created_at\": \"2024-01-01 00:00:01\",\n                \"updated_at\": \"2024-01-01 00:00:01\"\n            },\n            \"posts\": [\n                {\n                    \"id\": 1,\n                    \"title\": \"PHP is the best language!\",\n                    \"user_id\": 1,\n                    \"created_at\": \"2024-01-01 00:00:01\",\n                    \"updated_at\": \"2024-01-01 00:00:01\"\n                },\n                {\n                    \"id\": 2,\n                    \"title\": \"JAVA is the best language!\",\n                    \"user_id\": 1,\n                    \"created_at\": \"2024-01-01 00:00:02\",\n                    \"updated_at\": \"2024-01-01 00:00:02\"\n                },\n                {\n                    \"id\": 3,\n                    \"title\": \"Python is the best language!\",\n                    \"user_id\": 1,\n                    \"created_at\": \"2024-01-01 00:00:03\",\n                    \"updated_at\": \"2024-01-01 00:00:03\"\n                }\n            ]\n        },\n        {\n            \"id\": 2,\n            \"name\": \"Tom\",\n            \"country_id\": 2,\n            \"created_at\": \"2024-01-01 00:00:02\",\n            \"updated_at\": \"2024-01-01 00:00:02\",\n            \"country\": {\n                \"id\": 2,\n                \"name\": \"USA\",\n                \"created_at\": \"2024-01-01 00:00:02\",\n                \"updated_at\": \"2024-01-01 00:00:02\"\n            },\n            \"posts\": [\n                {\n                    \"id\": 4,\n                    \"title\": \"Go is the best language!\",\n                    \"user_id\": 2,\n                    \"created_at\": \"2024-01-01 00:00:04\",\n                    \"updated_at\": \"2024-01-01 00:00:04\"\n                },\n                {\n                    \"id\": 5,\n                    \"title\": \"JavaScript is the best language!\",\n                    \"user_id\": 2,\n                    \"created_at\": \"2024-01-01 00:00:05\",\n                    \"updated_at\": \"2024-01-01 00:00:05\"\n                },\n                {\n                    \"id\": 6,\n                    \"title\": \"Ruby is the best language!\",\n                    \"user_id\": 2,\n                    \"created_at\": \"2024-01-01 00:00:06\",\n                    \"updated_at\": \"2024-01-01 00:00:06\"\n                }\n            ]\n        },\n        {\n            \"id\": 3,\n            \"name\": \"Jerry\",\n            \"country_id\": 3,\n            \"created_at\": \"2024-01-01 00:00:03\",\n            \"updated_at\": \"2024-01-01 00:00:03\",\n            \"country\": {\n                \"id\": 3,\n                \"name\": \"Japan\",\n                \"created_at\": \"2024-01-01 00:00:03\",\n                \"updated_at\": \"2024-01-01 00:00:03\"\n            },\n            \"posts\": [\n                {\n                    \"id\": 7,\n                    \"title\": \"C is the best language!\",\n                    \"user_id\": 3,\n                    \"created_at\": \"2024-01-01 00:00:07\",\n                    \"updated_at\": \"2024-01-01 00:00:07\"\n                }\n            ]\n        },\n        {\n            \"id\": 4,\n            \"name\": \"Jack\",\n            \"country_id\": 4,\n            \"created_at\": \"2024-01-01 00:00:04\",\n            \"updated_at\": \"2024-01-01 00:00:04\",\n            \"country\": {\n                \"id\": 4,\n                \"name\": \"Korea\",\n                \"created_at\": \"2024-01-01 00:00:04\",\n                \"updated_at\": \"2024-01-01 00:00:04\"\n            },\n            \"posts\": []\n        },\n        {\n            \"id\": 5,\n            \"name\": \"Rose\",\n            \"country_id\": 5,\n            \"created_at\": \"2024-01-01 00:00:05\",\n            \"updated_at\": \"2024-01-01 00:00:05\",\n            \"country\": {\n                \"id\": 5,\n                \"name\": \"UK\",\n                \"created_at\": \"2024-01-01 00:00:05\",\n                \"updated_at\": \"2024-01-01 00:00:05\"\n            },\n            \"posts\": []\n        },\n        {\n            \"id\": 6,\n            \"name\": \"Lucy\",\n            \"country_id\": 6,\n            \"created_at\": \"2024-01-01 00:00:06\",\n            \"updated_at\": \"2024-01-01 00:00:06\",\n            \"country\": {\n                \"id\": 6,\n                \"name\": \"France\",\n                \"created_at\": \"2024-01-01 00:00:06\",\n                \"updated_at\": \"2024-01-01 00:00:06\"\n            },\n            \"posts\": []\n        },\n        {\n            \"id\": 7,\n            \"name\": \"Lily\",\n            \"country_id\": 7,\n            \"created_at\": \"2024-01-01 00:00:07\",\n            \"updated_at\": \"2024-01-01 00:00:07\",\n            \"country\": {\n                \"id\": 7,\n                \"name\": \"Germany\",\n                \"created_at\": \"2024-01-01 00:00:07\",\n                \"updated_at\": \"2024-01-01 00:00:07\"\n            },\n            \"posts\": []\n        }\n    ],\n    \"error\": {}\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003esimple paginate\u003c/summary\u003e\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse Guanguans\\LaravelApiResponse\\Support\\Traits\\ApiResponseFactory;\nuse Guanguans\\LaravelApiResponse\\Tests\\Laravel\\Models\\User;\nuse Illuminate\\Http\\JsonResponse;\n\nclass Controller extends \\App\\Http\\Controllers\\Controller\n{\n    use ApiResponseFactory;\n\n    public function example(): JsonResponse\n    {\n        $simplePaginate = User::query()-\u003ewith(['country', 'posts'])-\u003esimplePaginate(3);\n\n        return $this-\u003eapiResponse()-\u003esuccess($simplePaginate);\n    }\n}\n```\n\n```json\n{\n    \"status\": true,\n    \"code\": 200,\n    \"message\": \"OK\",\n    \"data\": {\n        \"data\": [\n            {\n                \"id\": 1,\n                \"name\": \"John\",\n                \"country_id\": 1,\n                \"created_at\": \"2024-01-01 00:00:01\",\n                \"updated_at\": \"2024-01-01 00:00:01\",\n                \"country\": {\n                    \"id\": 1,\n                    \"name\": \"China\",\n                    \"created_at\": \"2024-01-01 00:00:01\",\n                    \"updated_at\": \"2024-01-01 00:00:01\"\n                },\n                \"posts\": [\n                    {\n                        \"id\": 1,\n                        \"title\": \"PHP is the best language!\",\n                        \"user_id\": 1,\n                        \"created_at\": \"2024-01-01 00:00:01\",\n                        \"updated_at\": \"2024-01-01 00:00:01\"\n                    },\n                    {\n                        \"id\": 2,\n                        \"title\": \"JAVA is the best language!\",\n                        \"user_id\": 1,\n                        \"created_at\": \"2024-01-01 00:00:02\",\n                        \"updated_at\": \"2024-01-01 00:00:02\"\n                    },\n                    {\n                        \"id\": 3,\n                        \"title\": \"Python is the best language!\",\n                        \"user_id\": 1,\n                        \"created_at\": \"2024-01-01 00:00:03\",\n                        \"updated_at\": \"2024-01-01 00:00:03\"\n                    }\n                ]\n            },\n            {\n                \"id\": 2,\n                \"name\": \"Tom\",\n                \"country_id\": 2,\n                \"created_at\": \"2024-01-01 00:00:02\",\n                \"updated_at\": \"2024-01-01 00:00:02\",\n                \"country\": {\n                    \"id\": 2,\n                    \"name\": \"USA\",\n                    \"created_at\": \"2024-01-01 00:00:02\",\n                    \"updated_at\": \"2024-01-01 00:00:02\"\n                },\n                \"posts\": [\n                    {\n                        \"id\": 4,\n                        \"title\": \"Go is the best language!\",\n                        \"user_id\": 2,\n                        \"created_at\": \"2024-01-01 00:00:04\",\n                        \"updated_at\": \"2024-01-01 00:00:04\"\n                    },\n                    {\n                        \"id\": 5,\n                        \"title\": \"JavaScript is the best language!\",\n                        \"user_id\": 2,\n                        \"created_at\": \"2024-01-01 00:00:05\",\n                        \"updated_at\": \"2024-01-01 00:00:05\"\n                    },\n                    {\n                        \"id\": 6,\n                        \"title\": \"Ruby is the best language!\",\n                        \"user_id\": 2,\n                        \"created_at\": \"2024-01-01 00:00:06\",\n                        \"updated_at\": \"2024-01-01 00:00:06\"\n                    }\n                ]\n            },\n            {\n                \"id\": 3,\n                \"name\": \"Jerry\",\n                \"country_id\": 3,\n                \"created_at\": \"2024-01-01 00:00:03\",\n                \"updated_at\": \"2024-01-01 00:00:03\",\n                \"country\": {\n                    \"id\": 3,\n                    \"name\": \"Japan\",\n                    \"created_at\": \"2024-01-01 00:00:03\",\n                    \"updated_at\": \"2024-01-01 00:00:03\"\n                },\n                \"posts\": [\n                    {\n                        \"id\": 7,\n                        \"title\": \"C is the best language!\",\n                        \"user_id\": 3,\n                        \"created_at\": \"2024-01-01 00:00:07\",\n                        \"updated_at\": \"2024-01-01 00:00:07\"\n                    }\n                ]\n            }\n        ],\n        \"links\": {\n            \"first\": \"http:\\/\\/localhost?page=1\",\n            \"last\": null,\n            \"prev\": null,\n            \"next\": \"http:\\/\\/localhost?page=2\"\n        },\n        \"meta\": {\n            \"current_page\": 1,\n            \"from\": 1,\n            \"path\": \"http:\\/\\/localhost\",\n            \"per_page\": 3,\n            \"to\": 3\n        }\n    },\n    \"error\": {}\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eresource\u003c/summary\u003e\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse Guanguans\\LaravelApiResponse\\Support\\Traits\\ApiResponseFactory;\nuse Guanguans\\LaravelApiResponse\\Tests\\Laravel\\Models\\User;\nuse Guanguans\\LaravelApiResponse\\Tests\\Laravel\\Resources\\UserResource;\nuse Illuminate\\Http\\JsonResponse;\n\nclass Controller extends \\App\\Http\\Controllers\\Controller\n{\n    use ApiResponseFactory;\n\n    public function example(): JsonResponse\n    {\n        $userResource = UserResource::make(User::query()-\u003ewith(['country', 'posts'])-\u003efirst());\n\n        return $this-\u003eapiResponse()-\u003esuccess($userResource);\n    }\n}\n```\n\n```json\n{\n    \"status\": true,\n    \"code\": 200,\n    \"message\": \"OK\",\n    \"data\": {\n        \"id\": 1,\n        \"name\": \"John\",\n        \"country_id\": 1,\n        \"created_at\": \"2024-01-01 00:00:01\",\n        \"updated_at\": \"2024-01-01 00:00:01\",\n        \"country\": {\n            \"id\": 1,\n            \"name\": \"China\",\n            \"created_at\": \"2024-01-01 00:00:01\",\n            \"updated_at\": \"2024-01-01 00:00:01\"\n        },\n        \"posts\": [\n            {\n                \"id\": 1,\n                \"title\": \"PHP is the best language!\",\n                \"user_id\": 1,\n                \"created_at\": \"2024-01-01 00:00:01\",\n                \"updated_at\": \"2024-01-01 00:00:01\"\n            },\n            {\n                \"id\": 2,\n                \"title\": \"JAVA is the best language!\",\n                \"user_id\": 1,\n                \"created_at\": \"2024-01-01 00:00:02\",\n                \"updated_at\": \"2024-01-01 00:00:02\"\n            },\n            {\n                \"id\": 3,\n                \"title\": \"Python is the best language!\",\n                \"user_id\": 1,\n                \"created_at\": \"2024-01-01 00:00:03\",\n                \"updated_at\": \"2024-01-01 00:00:03\"\n            }\n        ]\n    },\n    \"error\": {}\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eresource collection\u003c/summary\u003e\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse Guanguans\\LaravelApiResponse\\Support\\Traits\\ApiResponseFactory;\nuse Guanguans\\LaravelApiResponse\\Tests\\Laravel\\Models\\User;\nuse Guanguans\\LaravelApiResponse\\Tests\\Laravel\\Resources\\UserCollection;\nuse Illuminate\\Http\\JsonResponse;\n\nclass Controller extends \\App\\Http\\Controllers\\Controller\n{\n    use ApiResponseFactory;\n\n    public function example(): JsonResponse\n    {\n        $userCollection = UserCollection::make(User::query()-\u003ewith(['country', 'posts'])-\u003eget());\n\n        return $this-\u003eapiResponse()-\u003esuccess($userCollection);\n    }\n}\n```\n\n```json\n{\n    \"status\": true,\n    \"code\": 200,\n    \"message\": \"OK\",\n    \"data\": {\n        \"data\": [\n            {\n                \"id\": 1,\n                \"name\": \"John\",\n                \"country_id\": 1,\n                \"created_at\": \"2024-01-01 00:00:01\",\n                \"updated_at\": \"2024-01-01 00:00:01\",\n                \"country\": {\n                    \"id\": 1,\n                    \"name\": \"China\",\n                    \"created_at\": \"2024-01-01 00:00:01\",\n                    \"updated_at\": \"2024-01-01 00:00:01\"\n                },\n                \"posts\": [\n                    {\n                        \"id\": 1,\n                        \"title\": \"PHP is the best language!\",\n                        \"user_id\": 1,\n                        \"created_at\": \"2024-01-01 00:00:01\",\n                        \"updated_at\": \"2024-01-01 00:00:01\"\n                    },\n                    {\n                        \"id\": 2,\n                        \"title\": \"JAVA is the best language!\",\n                        \"user_id\": 1,\n                        \"created_at\": \"2024-01-01 00:00:02\",\n                        \"updated_at\": \"2024-01-01 00:00:02\"\n                    },\n                    {\n                        \"id\": 3,\n                        \"title\": \"Python is the best language!\",\n                        \"user_id\": 1,\n                        \"created_at\": \"2024-01-01 00:00:03\",\n                        \"updated_at\": \"2024-01-01 00:00:03\"\n                    }\n                ]\n            },\n            {\n                \"id\": 2,\n                \"name\": \"Tom\",\n                \"country_id\": 2,\n                \"created_at\": \"2024-01-01 00:00:02\",\n                \"updated_at\": \"2024-01-01 00:00:02\",\n                \"country\": {\n                    \"id\": 2,\n                    \"name\": \"USA\",\n                    \"created_at\": \"2024-01-01 00:00:02\",\n                    \"updated_at\": \"2024-01-01 00:00:02\"\n                },\n                \"posts\": [\n                    {\n                        \"id\": 4,\n                        \"title\": \"Go is the best language!\",\n                        \"user_id\": 2,\n                        \"created_at\": \"2024-01-01 00:00:04\",\n                        \"updated_at\": \"2024-01-01 00:00:04\"\n                    },\n                    {\n                        \"id\": 5,\n                        \"title\": \"JavaScript is the best language!\",\n                        \"user_id\": 2,\n                        \"created_at\": \"2024-01-01 00:00:05\",\n                        \"updated_at\": \"2024-01-01 00:00:05\"\n                    },\n                    {\n                        \"id\": 6,\n                        \"title\": \"Ruby is the best language!\",\n                        \"user_id\": 2,\n                        \"created_at\": \"2024-01-01 00:00:06\",\n                        \"updated_at\": \"2024-01-01 00:00:06\"\n                    }\n                ]\n            },\n            {\n                \"id\": 3,\n                \"name\": \"Jerry\",\n                \"country_id\": 3,\n                \"created_at\": \"2024-01-01 00:00:03\",\n                \"updated_at\": \"2024-01-01 00:00:03\",\n                \"country\": {\n                    \"id\": 3,\n                    \"name\": \"Japan\",\n                    \"created_at\": \"2024-01-01 00:00:03\",\n                    \"updated_at\": \"2024-01-01 00:00:03\"\n                },\n                \"posts\": [\n                    {\n                        \"id\": 7,\n                        \"title\": \"C is the best language!\",\n                        \"user_id\": 3,\n                        \"created_at\": \"2024-01-01 00:00:07\",\n                        \"updated_at\": \"2024-01-01 00:00:07\"\n                    }\n                ]\n            },\n            {\n                \"id\": 4,\n                \"name\": \"Jack\",\n                \"country_id\": 4,\n                \"created_at\": \"2024-01-01 00:00:04\",\n                \"updated_at\": \"2024-01-01 00:00:04\",\n                \"country\": {\n                    \"id\": 4,\n                    \"name\": \"Korea\",\n                    \"created_at\": \"2024-01-01 00:00:04\",\n                    \"updated_at\": \"2024-01-01 00:00:04\"\n                },\n                \"posts\": []\n            },\n            {\n                \"id\": 5,\n                \"name\": \"Rose\",\n                \"country_id\": 5,\n                \"created_at\": \"2024-01-01 00:00:05\",\n                \"updated_at\": \"2024-01-01 00:00:05\",\n                \"country\": {\n                    \"id\": 5,\n                    \"name\": \"UK\",\n                    \"created_at\": \"2024-01-01 00:00:05\",\n                    \"updated_at\": \"2024-01-01 00:00:05\"\n                },\n                \"posts\": []\n            },\n            {\n                \"id\": 6,\n                \"name\": \"Lucy\",\n                \"country_id\": 6,\n                \"created_at\": \"2024-01-01 00:00:06\",\n                \"updated_at\": \"2024-01-01 00:00:06\",\n                \"country\": {\n                    \"id\": 6,\n                    \"name\": \"France\",\n                    \"created_at\": \"2024-01-01 00:00:06\",\n                    \"updated_at\": \"2024-01-01 00:00:06\"\n                },\n                \"posts\": []\n            },\n            {\n                \"id\": 7,\n                \"name\": \"Lily\",\n                \"country_id\": 7,\n                \"created_at\": \"2024-01-01 00:00:07\",\n                \"updated_at\": \"2024-01-01 00:00:07\",\n                \"country\": {\n                    \"id\": 7,\n                    \"name\": \"Germany\",\n                    \"created_at\": \"2024-01-01 00:00:07\",\n                    \"updated_at\": \"2024-01-01 00:00:07\"\n                },\n                \"posts\": []\n            }\n        ]\n    },\n    \"error\": {}\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eerror\u003c/summary\u003e\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse Guanguans\\LaravelApiResponse\\Support\\Traits\\ApiResponseFactory;\nuse Illuminate\\Http\\JsonResponse;\n\nclass Controller extends \\App\\Http\\Controllers\\Controller\n{\n    use ApiResponseFactory;\n\n    public function example(): JsonResponse\n    {\n        return $this-\u003eapiResponse()-\u003eerror('This is an error.');\n    }\n}\n```\n\n```json\n{\n    \"status\": false,\n    \"code\": 400,\n    \"message\": \"This is an error.\",\n    \"data\": {},\n    \"error\": {}\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eexception\u003c/summary\u003e\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse Guanguans\\LaravelApiResponse\\Support\\Traits\\ApiResponseFactory;\nuse Illuminate\\Http\\JsonResponse;\n\nclass Controller extends \\App\\Http\\Controllers\\Controller\n{\n    use ApiResponseFactory;\n\n    public function example(): JsonResponse\n    {\n        config()-\u003eset('app.debug', false);\n        $runtimeException = new \\RuntimeException('This is a runtime exception.');\n\n        return $this-\u003eapiResponse()-\u003eexception($runtimeException);\n    }\n}\n```\n\n```json\n{\n    \"status\": false,\n    \"code\": 500,\n    \"message\": \"Internal Server Error\",\n    \"data\": {},\n    \"error\": {\n        \"message\": \"Server Error\"\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003edebug exception\u003c/summary\u003e\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse Guanguans\\LaravelApiResponse\\Support\\Traits\\ApiResponseFactory;\nuse Illuminate\\Http\\JsonResponse;\n\nclass Controller extends \\App\\Http\\Controllers\\Controller\n{\n    use ApiResponseFactory;\n\n    public function example(): JsonResponse\n    {\n        config()-\u003eset('app.debug', true);\n        $runtimeException = new \\RuntimeException('This is a runtime exception.');\n\n        return $this-\u003eapiResponse()-\u003eexception($runtimeException);\n    }\n}\n```\n\n```json\n{\n    \"status\": false,\n    \"code\": 500,\n    \"message\": \"This is a runtime exception.\",\n    \"data\": {},\n    \"error\": {\n        \"message\": \"This is a runtime exception.\",\n        \"exception\": \"RuntimeException\",\n        \"file\": \"\\/tests\\/Feature\\/ExceptionDataTypesTest.php\",\n        \"line\": 45,\n        \"trace\": [\n            {\n                \"function\": \"{closure}\",\n                \"class\": \"P\\\\Tests\\\\Feature\\\\ExceptionDataTypesTest\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/pestphp\\/pest\\/src\\/Factories\\/TestCaseFactory.php\",\n                \"line\": 151,\n                \"function\": \"call_user_func\"\n            },\n            {\n                \"function\": \"Pest\\\\Factories\\\\{closure}\",\n                \"class\": \"P\\\\Tests\\\\Feature\\\\ExceptionDataTypesTest\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/pestphp\\/pest\\/src\\/Concerns\\/Testable.php\",\n                \"line\": 301,\n                \"function\": \"call_user_func_array\"\n            },\n            {\n                \"file\": \"\\/vendor\\/pestphp\\/pest\\/src\\/Support\\/ExceptionTrace.php\",\n                \"line\": 29,\n                \"function\": \"Pest\\\\Concerns\\\\{closure}\",\n                \"class\": \"P\\\\Tests\\\\Feature\\\\ExceptionDataTypesTest\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/pestphp\\/pest\\/src\\/Concerns\\/Testable.php\",\n                \"line\": 302,\n                \"function\": \"ensure\",\n                \"class\": \"Pest\\\\Support\\\\ExceptionTrace\",\n                \"type\": \"::\"\n            },\n            {\n                \"file\": \"\\/vendor\\/pestphp\\/pest\\/src\\/Concerns\\/Testable.php\",\n                \"line\": 278,\n                \"function\": \"__callClosure\",\n                \"class\": \"P\\\\Tests\\\\Feature\\\\ExceptionDataTypesTest\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/phpunit\\/phpunit\\/src\\/Framework\\/TestCase.php\",\n                \"line\": 1617,\n                \"function\": \"__test\",\n                \"class\": \"P\\\\Tests\\\\Feature\\\\ExceptionDataTypesTest\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/phpunit\\/phpunit\\/src\\/Framework\\/TestCase.php\",\n                \"line\": 1223,\n                \"function\": \"runTest\",\n                \"class\": \"PHPUnit\\\\Framework\\\\TestCase\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/phpunit\\/phpunit\\/src\\/Framework\\/TestResult.php\",\n                \"line\": 729,\n                \"function\": \"runBare\",\n                \"class\": \"PHPUnit\\\\Framework\\\\TestCase\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/phpunit\\/phpunit\\/src\\/Framework\\/TestCase.php\",\n                \"line\": 973,\n                \"function\": \"run\",\n                \"class\": \"PHPUnit\\\\Framework\\\\TestResult\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/phpunit\\/phpunit\\/src\\/Framework\\/TestSuite.php\",\n                \"line\": 685,\n                \"function\": \"run\",\n                \"class\": \"PHPUnit\\\\Framework\\\\TestCase\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/phpunit\\/phpunit\\/src\\/Framework\\/TestSuite.php\",\n                \"line\": 685,\n                \"function\": \"run\",\n                \"class\": \"PHPUnit\\\\Framework\\\\TestSuite\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/phpunit\\/phpunit\\/src\\/TextUI\\/TestRunner.php\",\n                \"line\": 651,\n                \"function\": \"run\",\n                \"class\": \"PHPUnit\\\\Framework\\\\TestSuite\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/phpunit\\/phpunit\\/src\\/TextUI\\/Command.php\",\n                \"line\": 146,\n                \"function\": \"run\",\n                \"class\": \"PHPUnit\\\\TextUI\\\\TestRunner\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/pestphp\\/pest\\/src\\/Console\\/Command.php\",\n                \"line\": 119,\n                \"function\": \"run\",\n                \"class\": \"PHPUnit\\\\TextUI\\\\Command\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/pestphp\\/pest\\/bin\\/pest\",\n                \"line\": 61,\n                \"function\": \"run\",\n                \"class\": \"Pest\\\\Console\\\\Command\",\n                \"type\": \"-\u003e\"\n            },\n            {\n                \"file\": \"\\/vendor\\/pestphp\\/pest\\/bin\\/pest\",\n                \"line\": 62,\n                \"function\": \"{closure}\"\n            },\n            {\n                \"file\": \"\\/vendor\\/bin\\/pest\",\n                \"line\": 115,\n                \"function\": \"include\"\n            }\n        ]\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eexception handler\u003c/summary\u003e\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse Guanguans\\LaravelApiResponse\\Middleware\\SetAcceptHeader;\nuse Illuminate\\Http\\JsonResponse;\n\nclass Controller extends \\App\\Http\\Controllers\\Controller\n{\n    public function __construct()\n    {\n        $this-\u003emiddleware(SetAcceptHeader::class)-\u003eonly('example');\n    }\n\n    public function example(): JsonResponse\n    {\n        config()-\u003eset('app.debug', false);\n\n        throw new \\RuntimeException('This is a runtime exception.');\n    }\n}\n```\n\n```json\n{\n    \"status\": false,\n    \"code\": 500,\n    \"message\": \"Internal Server Error\",\n    \"data\": {},\n    \"error\": {\n        \"message\": \"Server Error\"\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003elocale exception\u003c/summary\u003e\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse Guanguans\\LaravelApiResponse\\Support\\Traits\\ApiResponseFactory;\nuse Illuminate\\Http\\JsonResponse;\n\nclass Controller extends \\App\\Http\\Controllers\\Controller\n{\n    use ApiResponseFactory;\n\n    public function example(): JsonResponse\n    {\n        config()-\u003eset('app.debug', false);\n        config()-\u003eset('app.locale', 'zh_CN');\n        $runtimeException = new \\RuntimeException('This is a runtime exception.');\n\n        return $this-\u003eapiResponse()-\u003eexception($runtimeException);\n    }\n}\n```\n\n```json\n{\n    \"status\": false,\n    \"code\": 500,\n    \"message\": \"内部服务器错误\",\n    \"data\": {},\n    \"error\": {\n        \"message\": \"Server Error\"\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003emore examples...\u003c/summary\u003e\n\n* [feature](tests/Feature)\n* [examples](tests/__snapshots__)\n\n\u003c/details\u003e\n\n### FAQ\n\n\u003cdetails\u003e\n\u003csummary\u003eHow to customize pipe\u003c/summary\u003e\n\n* Reference to the [Pipes](src/Pipes)\n* Simple example:\n\n```php\n\u003c?php\n\nstatic function (array $data, \\Closure $next): JsonResponse {\n    if ($data['data'] instanceof \\iterable) {\n        $data['data'] = iterator_to_array($data['data']);\n    }\n\n    return $next($data);\n};\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eHow to customize exception pipe\u003c/summary\u003e\n\n* Reference to the [ExceptionPipes](src/ExceptionPipes)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eHow to customize pipe in a single api\u003c/summary\u003e\n\n* Reference to the [HasPipes.php](src/Concerns/HasPipes.php)、[HasExceptionPipes.php](src/Concerns/HasExceptionPipes.php)\n* Simple example:\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse Guanguans\\LaravelApiResponse\\Support\\Traits\\ApiResponseFactory;\nuse Illuminate\\Http\\JsonResponse;\n\nclass Controller extends \\App\\Http\\Controllers\\Controller\n{\n    use ApiResponseFactory;\n\n    public function example(): JsonResponse\n    {\n        return $this\n            -\u003eapiResponse()\n            // -\u003eunshiftPipes(...)\n            -\u003epushPipes(\n                static function (array $data, \\Closure $next): JsonResponse {\n                    if ($data['data'] instanceof \\iterable) {\n                        $data['data'] = iterator_to_array($data['data']);\n                    }\n\n                    return $next($data);\n                }\n            )\n            // -\u003eunshiftExceptionPipes(...)\n            // -\u003epushExceptionPipes(...)\n            -\u003esuccess($iterator);\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eHow to always respond with successful http status code\u003c/summary\u003e\n\n* Reference to the [StatusCodePipe.php](src/Pipes/StatusCodePipe.php)\n* Remove the configuration `api-response.pipes.StatusCodePipe`\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eHow to localize message\u003c/summary\u003e\n\n* Reference to the [MessagePipe.php](src/Pipes/MessagePipe.php)\n* Install [Laravel-Lang/http-statuses](https://github.com/Laravel-Lang/http-statuses) `composer require --dev laravel-lang/http-statuses` or create lang files `resources/lang/***/http-statuses.php`\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eShortcut methods of http status\u003c/summary\u003e\n\n* Reference to the [ConcreteHttpStatus.php](src/Concerns/ConcreteHttpStatus.php)\n\n\u003c/details\u003e\n\n## Testing\n\n```shell\ncomposer test\n```\n\n## Changelog\n\nPlease see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.\n\n## Contributing\n\nPlease see [CONTRIBUTING](.github/CONTRIBUTING.md) for details.\n\n## Security Vulnerabilities\n\nPlease review [our security policy](../../security/policy) on how to report security vulnerabilities.\n\n## Credits\n\n* [guanguans](https://github.com/guanguans)\n* [All Contributors](../../contributors)\n\n## Thanks\n\n[![](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)](https://www.jetbrains.com/?from=https://github.com/guanguans)\n\n## License\n\nThe MIT License (MIT). Please see [License File](LICENSE) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguanguans%2Flaravel-api-response","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguanguans%2Flaravel-api-response","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguanguans%2Flaravel-api-response/lists"}