anyo-lab/api-response 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

anyo-lab/api-response

Composer 安装命令:

composer require anyo-lab/api-response

包简介

A Laravel package for universal API response and error handling

README 文档

README

Latest Version on Packagist Total Downloads License Tests

A comprehensive Laravel package for universal API response and error handling. This package provides a standardized way to format API responses and handle exceptions in Laravel applications with multiple usage patterns and advanced features.

🚀 Features

  • 🎯 Standardized API Responses - Consistent response format across your entire API
  • 🛡️ Automatic Exception Handling - Custom exception handler for API routes
  • 📝 Multiple Usage Methods - Use as service, trait, facade, macros, or helper functions
  • ⚙️ Highly Configurable - Customize response structure and messages
  • 📊 Built-in Pagination - Automatic pagination response formatting
  • 🔧 Laravel 9-12 Support - Compatible with multiple Laravel versions
  • 🎯 Resource Classes - Built-in resource transformation classes
  • 🔌 Response Macros - Extend Laravel's response with API methods
  • 🌐 Global Helpers - Easy-to-use global helper functions
  • 🛠️ Middleware Support - Automatic response formatting middleware
  • 🚦 Rate Limiting Integration - Formatted rate limiting responses
  • 📦 Response Compression - Automatic response compression (gzip, deflate)
  • 🔄 API Versioning - Built-in API versioning support
  • 📈 Performance Monitoring - Response performance tracking

📋 Requirements

  • PHP >= 8.1
  • Laravel >= 9.0

🔧 Installation

Via Composer

composer require anyo-lab/api-response

Manual Installation

  1. Clone or download this package
  2. Add to your composer.json:
{
    "require": {
        "anyo-lab/api-response": "*"
    },
    "repositories": [
        {
            "type": "path",
            "url": "path/to/api-response"
        }
    ]
}
  1. Run composer update

⚙️ Configuration

Publish the configuration file:

php artisan vendor:publish --provider="ApiResponse\ApiResponseServiceProvider" --tag="api-response-config"

This will create config/api-response.php with customizable options.

Production readiness

Before using in a live project:

  1. Set APP_DEBUG=false in .env so error responses never expose stack traces or file paths.
  2. Publish config (optional): php artisan vendor:publish --tag=api-response-config to override messages, structure, or timestamp format.
  3. Override messages in config/api-response.php under messages so all default strings (e.g. "Resource not found") come from one place.
  4. Optional: Enable include_request_id and include_error_codes in config for tracing and machine-readable error codes.

All responses use the same config (structure, timestamp, error codes). ResponseHelper and resources use the same settings as the main ApiResponse service.

Upgrading / Breaking changes

  • Response caching removed: The package no longer provides api_cache(), api_remember(), or ApiResponseCache. For cached API responses, use Laravel’s Cache::remember() with api_success():

    use Illuminate\Support\Facades\Cache;
    
    $data = Cache::remember('users.list', 3600, fn () => User::all());
    return api_success($data, 'Success');
  • 204 No Content: noContent() now returns an empty response body (RFC 7231) instead of a JSON body.

  • Performance monitoring optional: Set register_performance_monitoring to false in config to disable cache usage when you do not use api_performance().

See CHANGELOG.md for full version history.

🎯 Quick Start

Basic Usage

use ApiResponse\ApiResponse;

class UserController extends Controller
{
    public function index(ApiResponse $apiResponse)
    {
        $users = User::paginate(10);
        
        return $apiResponse->paginated($users, 'Users retrieved successfully');
    }

    public function store(Request $request, ApiResponse $apiResponse)
    {
        $user = User::create($request->validated());
        
        return $apiResponse->created($user, 'User created successfully');
    }
}

Tip: For testability and flexibility, type-hint ApiResponseContract instead of ApiResponse so you can swap or mock the implementation.

📖 Usage Methods

Method 1: Service Injection

use ApiResponse\ApiResponse;

class UserController extends Controller
{
    public function index(ApiResponse $apiResponse)
    {
        $users = User::paginate(10);
        
        return $apiResponse->paginated($users, 'Users retrieved successfully');
    }

    public function store(Request $request, ApiResponse $apiResponse)
    {
        $user = User::create($request->validated());
        
        return $apiResponse->created($user, 'User created successfully');
    }
}

Method 2: Trait Usage

use ApiResponse\Traits\ApiResponseTrait;

class UserController extends Controller
{
    use ApiResponseTrait;

    public function index()
    {
        $users = User::paginate(10);
        
        return $this->paginatedResponse($users, 'Users retrieved successfully');
    }

    public function store(Request $request)
    {
        $user = User::create($request->validated());
        
        return $this->createdResponse($user, 'User created successfully');
    }
}

Method 3: Facade Usage

use ApiResponse\Facades\ApiResponse;

class UserController extends Controller
{
    public function index()
    {
        $users = User::paginate(10);
        
        return ApiResponse::paginated($users, 'Users retrieved successfully');
    }

    public function store(Request $request)
    {
        $user = User::create($request->validated());
        
        return ApiResponse::created($user, 'User created successfully');
    }
}

Method 4: Response Macros

class UserController extends Controller
{
    public function index()
    {
        $users = User::paginate(10);
        
        return response()->apiPaginated($users, 'Users retrieved successfully');
    }

    public function store(Request $request)
    {
        $user = User::create($request->validated());
        
        return response()->apiCreated($user, 'User created successfully');
    }
}

Method 5: Global Helper Functions

class UserController extends Controller
{
    public function index()
    {
        $users = User::paginate(10);
        
        return api_paginated($users, 'Users retrieved successfully');
    }

    public function store(Request $request)
    {
        $user = User::create($request->validated());
        
        return api_created($user, 'User created successfully');
    }
}

Method 6: Resource Classes

use ApiResponse\Resources\ApiResource;
use Illuminate\Http\Request;

class UserResource extends ApiResource
{
    protected function transformData(Request $request): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at?->toISOString(),
        ];
    }

    protected function getMessage(): string
    {
        return 'User retrieved successfully';
    }
}

class UserController extends Controller
{
    public function show($id)
    {
        $user = User::findOrFail($id);
        
        return new UserResource($user);
    }

    public function index()
    {
        $users = User::paginate(10);
        
        return UserResource::collection($users);
    }
}

📤 Response Methods

Success Responses

// Basic success response
$apiResponse->success($data, 'Success message');

// Created response (201)
$apiResponse->created($data, 'Resource created');

// No content response (204)
$apiResponse->noContent('No content available');

// Paginated response
$apiResponse->paginated($paginator, 'Data retrieved');

// Collection response
$apiResponse->collection($collection, 'Data retrieved');

// Resource response
$apiResponse->resource($resource, 'Resource retrieved');

Error Responses

// Basic error response
$apiResponse->error('Error message', 400);

// Validation error (422)
$apiResponse->validationError($errors, 'Validation failed');

// Not found (404)
$apiResponse->notFound('Resource not found');

// Unauthorized (401)
$apiResponse->unauthorized('Authentication required');

// Forbidden (403)
$apiResponse->forbidden('Access denied');

// Server error (500)
$apiResponse->serverError('Internal server error');

// Bad request (400)
$apiResponse->badRequest('Invalid request');

// Conflict (409)
$apiResponse->conflict('Resource conflict');

// Too many requests (429)
$apiResponse->tooManyRequests('Rate limit exceeded');

📋 Response Format

All responses follow this standardized format:

Success Response

{
    "success": true,
    "message": "Success message",
    "data": {
        "id": 1,
        "name": "John Doe",
        "email": "john@example.com"
    },
    "errors": null,
    "meta": null,
    "timestamp": "2024-01-01T12:00:00.000000Z"
}

Error Response

{
    "success": false,
    "message": "Error message",
    "data": null,
    "errors": {
        "email": ["The email field is required."],
        "password": ["The password must be at least 8 characters."]
    },
    "meta": null,
    "timestamp": "2024-01-01T12:00:00.000000Z"
}

Pagination Response

{
    "success": true,
    "message": "Data retrieved successfully",
    "data": [
        {
            "id": 1,
            "name": "John Doe"
        }
    ],
    "errors": null,
    "meta": {
        "current_page": 1,
        "per_page": 10,
        "total": 100,
        "last_page": 10,
        "from": 1,
        "to": 10,
        "has_more_pages": true
    },
    "timestamp": "2024-01-01T12:00:00.000000Z"
}

🛡️ Exception Handling

The package includes a custom exception handler that automatically formats exceptions for API routes:

Exception Status Code Description
ValidationException 422 Validation errors
AuthenticationException 401 Unauthorized
ModelNotFoundException 404 Not found
NotFoundHttpException 404 Not found
QueryException 500 Server error (with debug info in development)
HttpException Respective HTTP status code

⚙️ Configuration Options

Response Structure

'structure' => [
    'success' => 'success',
    'message' => 'message',
    'data' => 'data',
    'errors' => 'errors',
    'meta' => 'meta',
    'timestamp' => 'timestamp',
],

Default Messages

'messages' => [
    'success' => 'Success',
    'created' => 'Resource created successfully',
    'updated' => 'Resource updated successfully',
    'deleted' => 'Resource deleted successfully',
    'not_found' => 'Resource not found',
    'unauthorized' => 'Unauthorized',
    'forbidden' => 'Forbidden',
    'validation_failed' => 'Validation failed',
    'server_error' => 'Internal server error',
    'bad_request' => 'Bad request',
    'conflict' => 'Conflict occurred',
    'too_many_requests' => 'Too many requests',
],

Other Options

'include_timestamp' => true,
'timestamp_format' => 'Y-m-d H:i:s',
'debug' => env('APP_DEBUG', false),
'use_exception_handler' => true,
'api_routes_pattern' => 'api/*',

🔄 Advanced Features

Middleware Support

// In your routes/api.php
Route::middleware(['api.response'])->group(function () {
    Route::get('/users', [UserController::class, 'index']);
    Route::post('/users', [UserController::class, 'store']);
});

// Or register globally in App\Http\Kernel.php
protected $middlewareGroups = [
    'api' => [
        \ApiResponse\Http\Middleware\ApiResponseMiddleware::class,
        // ... other middleware
    ],
];

API Versioning

use ApiResponse\Services\ApiVersioningService;

class UserController extends Controller
{
    public function index(ApiVersioningService $versioning)
    {
        $version = $versioning->getVersion(request());
        
        if ($version === 'v2') {
            // Return v2 format
            return $this->paginatedResponseV2($users);
        }
        
        // Return v1 format
        return $this->paginatedResponse($users);
    }
}

Response Compression

use ApiResponse\Services\ResponseCompressionService;

class UserController extends Controller
{
    public function index(ResponseCompressionService $compression)
    {
        $response = $this->paginatedResponse($users);
        
        return $compression->compress(request(), $response);
    }
}

Performance Monitoring

use ApiResponse\Services\PerformanceMonitoringService;

class UserController extends Controller
{
    public function index(PerformanceMonitoringService $monitoring)
    {
        $monitoring->startMonitoring(request());

        $users = User::paginate(10);
        $response = $this->paginatedResponse($users);

        $monitoring->endMonitoring(request(), $response);

        return $response;
    }
}

🧪 Testing

<?php

namespace Tests\Feature;

use Tests\TestCase;
use App\Models\User;

class UserApiTest extends TestCase
{
    public function test_can_get_users()
    {
        $response = $this->getJson('/api/users');

        $response->assertStatus(200)
                ->assertJsonStructure([
                    'success',
                    'message',
                    'data',
                    'meta',
                    'timestamp'
                ])
                ->assertJson([
                    'success' => true,
                    'message' => 'Users retrieved successfully'
                ]);
    }

    public function test_can_create_user()
    {
        $userData = [
            'name' => 'John Doe',
            'email' => 'john@example.com',
            'password' => 'password123'
        ];

        $response = $this->postJson('/api/users', $userData);

        $response->assertStatus(201)
                ->assertJson([
                    'success' => true,
                    'message' => 'User created successfully'
                ]);
    }

    public function test_validation_errors()
    {
        $response = $this->postJson('/api/users', []);

        $response->assertStatus(422)
                ->assertJson([
                    'success' => false,
                    'message' => 'Validation failed'
                ])
                ->assertJsonStructure([
                    'errors' => [
                        'name',
                        'email',
                        'password'
                    ]
                ]);
    }
}

📊 Complete Example

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use ApiResponse\Traits\ApiResponseTrait;
use Illuminate\Validation\ValidationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;

class UserController extends Controller
{
    use ApiResponseTrait;

    public function index()
    {
        try {
            $users = User::paginate(10);
            return $this->paginatedResponse($users, 'Users retrieved successfully');
        } catch (\Exception $e) {
            return $this->serverErrorResponse('Failed to retrieve users');
        }
    }

    public function store(Request $request)
    {
        try {
            $validated = $request->validate([
                'name' => 'required|string|max:255',
                'email' => 'required|email|unique:users',
                'password' => 'required|min:8',
            ]);

            $user = User::create($validated);
            return $this->createdResponse($user, 'User created successfully');
        } catch (ValidationException $e) {
            return $this->validationErrorResponse($e->errors(), 'Validation failed');
        } catch (\Exception $e) {
            return $this->serverErrorResponse('Failed to create user');
        }
    }

    public function show($id)
    {
        try {
            $user = User::findOrFail($id);
            return $this->resourceResponse($user, 'User retrieved successfully');
        } catch (ModelNotFoundException $e) {
            return $this->notFoundResponse('User not found');
        }
    }

    public function update(Request $request, $id)
    {
        try {
            $user = User::findOrFail($id);
            $validated = $request->validate([
                'name' => 'sometimes|string|max:255',
                'email' => 'sometimes|email|unique:users,email,' . $id,
            ]);

            $user->update($validated);
            return $this->successResponse($user, 'User updated successfully');
        } catch (ModelNotFoundException $e) {
            return $this->notFoundResponse('User not found');
        } catch (ValidationException $e) {
            return $this->validationErrorResponse($e->errors(), 'Validation failed');
        }
    }

    public function destroy($id)
    {
        try {
            $user = User::findOrFail($id);
            $user->delete();
            return $this->successResponse(null, 'User deleted successfully');
        } catch (ModelNotFoundException $e) {
            return $this->notFoundResponse('User not found');
        }
    }
}

Testing this package

composer install
composer test           # run PHPUnit
composer format:check   # Laravel Pint
composer analyse        # PHPStan

Enterprise & production

For production use, enable request IDs and error codes in config; apply rate limiting and set APP_DEBUG=false.

🤝 Contributing

Please see CONTRIBUTING.md for development setup, code style, and pull request guidelines.

Security

If you discover a security vulnerability, please see SECURITY.md.

Changelog

See CHANGELOG.md for version history.

📄 License

This package is open-sourced software licensed under the MIT license.

🆘 Support

🙏 Acknowledgments

  • Laravel team for the amazing framework
  • All contributors who help improve this package
  • The open-source community for inspiration and feedback

Laravel API Response – A generic package for standardized API responses.

anyo-lab/api-response 适用场景与选型建议

anyo-lab/api-response 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 7 次下载、GitHub Stars 达 0, 最近一次更新时间为 2026 年 02 月 23 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「json」 「rest」 「api」 「response」 「laravel」 「enterprise」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 anyo-lab/api-response 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 anyo-lab/api-response 我们能提供哪些服务?
定制开发 / 二次开发

基于 anyo-lab/api-response 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 7
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 17
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-02-23