bahadovic / laravel-api-response
A fluent, standard API Response Builder for Laravel.
v1.0.0
2026-09-06 13:10 UTC
Requires
- php: ^8.2
- illuminate/http: ^10.0|^11.0|^12.0
- illuminate/pagination: ^10.0|^11.0|^12.0
- illuminate/support: ^10.0|^11.0|^12.0
- illuminate/validation: ^10.0|^11.0|^12.0
Requires (Dev)
- larastan/larastan: ^2.0|^3.0
- laravel/pint: ^1.0
- orchestra/testbench: ^8.0|^9.0|^10.0
- phpunit/phpunit: ^10.0|^11.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
A fluent, modern, and highly-flexible API response builder for Laravel. Designed for minimal runtime overhead, strict typing, and native support for Eloquent Resources and all Laravel Pagination types.
๐ Features
- Standardized Output: Unified format for success, errors, and pagination.
- Fluent & Static Interface: Use clean one-liners or fluent chainable methods.
- Native Eloquent Resources: Native support for
JsonResourceandResourceCollection, while preserving Laravel resource behavior. - Supported Pagination: Full support for Laravel
LengthAwarePaginator,Paginator, andCursorPaginator. - Extensible via Macros: Easily extend the class using Laravel's
Macroabletrait. - Customizable Keys: Fully configurable JSON response keys.
- Note on Eloquent Resources: When returning a
JsonResourceorResourceCollection, Laravel's native$wrapproperty (usually"data") takes precedence for wrapping the main payload. This is a deliberate design choice to preserve the native behavior of your Eloquent API resources.
๐ฆ Installation
Install the package via Composer:
composer require bahadovic/laravel-api-response
Optionally, publish the config file to customize keys and messages:
php artisan vendor:publish --tag="api-response-config"
๐ก Usage
1. Static One-Liners (Quick & Simple)
use Bahadovic\ApiResponse\Facades\ApiResponse; // Success Response (200 OK) return ApiResponse::success($user, 'User profile fetched.'); // Created Response (201 Created) return ApiResponse::created($user, 'Account created successfully.'); // Error Response (400 Bad Request) return ApiResponse::error('Unable to process payment.', 400); // Validation Error (422 Unprocessable Entity) return ApiResponse::validationError($validator->errors()); // Unauthorized (401) & Forbidden (403) return ApiResponse::unauthorized(); return ApiResponse::forbidden(); // Not Found (404) return ApiResponse::notFound('Post not found.'); // No Content (204) return ApiResponse::noContent();
2. Fluent Chaining Interface
use Bahadovic\ApiResponse\Facades\ApiResponse; return ApiResponse::make() ->data($orders) ->message('Orders loaded successfully.') ->status(200) ->withMeta([ 'execution_time_ms' => 45, 'server' => 'app-node-01', ]) ->withHeaders([ 'X-API-Version' => 'v2', ]) ->send();
3. Pagination Support (Eloquent & Cursor)
Simply pass any paginator instance directly to success():
// Standard LengthAware Pagination $users = User::paginate(15); return ApiResponse::success($users); // High-Performance Cursor Pagination $logs = ActivityLog::cursorPaginate(20); return ApiResponse::success($logs);
Output Example (LengthAware):
{
"success": true,
"message": "Operation completed successfully.",
"data": [...],
"meta": {
"per_page": 15,
"has_more": true,
"total": 120,
"current_page": 1,
"last_page": 8
}
}
4. Controller Trait
Add HasApiResponse to your Base Controller:
namespace App\Http\Controllers; use Bahadovic\ApiResponse\Traits\HasApiResponse; class UserController extends Controller { use HasApiResponse; public function index() { return $this->successResponse(User::all(), 'Users retrieved.'); } public function show($id) { $user = User::find($id); if (!$user) { return $this->notFoundResponse('User not found.'); } return $this->successResponse($user); } }
๐งช Testing
composer test
๐งฉ Compatibility
| Package Version | Laravel Version | PHP Version |
|---|---|---|
| ^1.0 | 10.x, 11.x, 12.x | ^8.2 |
๐ License
The MIT License (MIT). Please see License File for more information.