mahmoud-almalah / laravel-api-helpers
Standardized API responses for Laravel applications.
Package info
github.com/mahmoud-almalah/laravel-api-helpers
pkg:composer/mahmoud-almalah/laravel-api-helpers
Fund package maintenance!
Requires
- php: ^8.3
- laravel/framework: ^11.44|^12.4|^13.0
Requires (Dev)
- laravel/pint: ^1.22.0
- orchestra/testbench: ^10.2|^11.0
- pestphp/pest: ^3.8.1
- pestphp/pest-plugin-type-coverage: ^3.5
- phpstan/phpstan: ^1.12.23
- rector/rector: ^1.2.10
- roave/security-advisories: dev-latest
- symfony/var-dumper: ^7.2.3
README
A clean and elegant Laravel package that provides a consistent and customizable structure for your API development. It includes standardized response classes and exception handling.
✨ Features
- ✅ Consistent JSON Responses for success, errors, collections, and resources.
- ✅ Standardized Exception Handling via
ApiExceptionHandlerclass. - ✅ Strict Typing and architecture built around extending
BaseApiResponse. - ✅ Laravel 11+ Support.
- ✅ Full test coverage with Pest and Max Level PHPStan.
📦 Installation
composer require mahmoud-almalah/laravel-api-helpers
⚙️ Configuration
You can publish the configuration file to customize the internal settings:
php artisan vendor:publish --tag=api-helpers-config
This will publish config/api-helpers.php.
🚀 Usage
1️⃣ Standardized Responses
Use the ApiResponse factory to return consistent JSON responses.
Success Response
use MahmoudAlmalah\LaravelApiHelpers\Responses\ApiResponse; public function index() { return ApiResponse::success( data: ['foo' => 'bar'], message: 'Operation successful' ); }
Error Response
use MahmoudAlmalah\LaravelApiHelpers\Responses\ApiResponse; use Symfony\Component\HttpFoundation\Response; public function error() { return ApiResponse::error( message: 'Something went wrong', status: Response::HTTP_BAD_REQUEST ); }
Resource/Model Response
Wraps your Eloquent model or JsonResource.
use MahmoudAlmalah\LaravelApiHelpers\Responses\ApiResponse; use App\Http\Resources\UserResource; public function show(User $user) { return ApiResponse::model( key: 'user', resource: new UserResource($user), message: 'User retrieved successfully' ); }
Collection Response
Handles pagination metadata automatically.
use MahmoudAlmalah\LaravelApiHelpers\Responses\ApiResponse; use App\Http\Resources\UserResource; public function index() { $users = User::paginate(10); return ApiResponse::collection( key: 'users', resource: UserResource::collection($users), paginator: $users, message: 'Users list' ); }
2️⃣ Standardized Exception Handling
Catch exceptions and return consistent JSON error responses, including detailed debug info in local development.
Setup in bootstrap/app.php (Laravel 11+):
use Illuminate\Foundation\Configuration\Exceptions; use Illuminate\Http\Request; use MahmoudAlmalah\LaravelApiHelpers\Exceptions\ApiExceptionHandler; ->withExceptions(function (Exceptions $exceptions) { $exceptions->render(function (\Throwable $e, Request $request) { if ($request->is('api/*') || $request->expectsJson()) { return ApiExceptionHandler::render($e); } }); })
Debug Info (Local Environment):
When APP_ENV=local, exceptions will include debug details:
{
"success": false,
"message": "Call to undefined method App\\Models\\User::unknown()",
"data": null,
"debug": {
"exception": {
"class": "BadMethodCallException",
"file": "/var/www/html/app/Http/Controllers/UserController.php",
"line": 45,
"trace": [...]
},
"request": {
"method": "GET",
"url": "http://localhost/api/users",
"input": []
},
"time": "2023-10-25T14:30:00+00:00"
}
}
In Production, it safely returns:
{
"success": false,
"message": "Server Error",
"data": null
}
✅ Output Format
Success Response:
{
"success": true,
"message": "Users list",
"data": {
"users": [
...
]
},
"meta": {
"current_page": 1,
"per_page": 10,
"has_more_pages": true
}
}
Error Response:
{
"success": false,
"message": "Resource not found",
"data": null
}
🧪 Testing
Run the test suite:
composer test
Run static analysis:
composer test:types
📄 License
The MIT License (MIT). See LICENSE for more information.