stackmasteraliza/laravel-api-response
Installation:
composer require stackmasteraliza/laravel-api-response
Publish the config (optional):
php artisan vendor:publish --provider="Stackmasteraliza\ApiResponse\ApiResponseServiceProvider" --tag="config"
First Use Case:
Replace manual return response()->json() calls with the fluent builder in your controller:
use Stackmasteraliza\ApiResponse\ApiResponse;
public function show(User $user)
{
return ApiResponse::success($user)->withMeta(['custom' => 'value']);
}
Key Files to Review:
config/api-response.php (for customization)app/Http/Controllers/Concerns/RespondsWithApiResponse.php (trait for auto-injection)Use the trait in your base controller or individual controllers:
use Stackmasteraliza\ApiResponse\Concerns\RespondsWithApiResponse;
class UserController extends Controller
{
use RespondsWithApiResponse;
public function index()
{
return $this->success(User::all());
}
}
Chain methods for complex responses:
return ApiResponse::success($data)
->withMeta(['pagination' => $data->appends(request()->query())])
->withLinks(['next' => url()->current() . '?page=2'])
->setStatusCode(201);
Replace manual validation error formatting:
public function store(Request $request)
{
$validated = $request->validate(User::$rules);
return $this->error('Validation failed', $validated->errors(), 422);
}
Automatically attach pagination metadata:
return ApiResponse::success(User::paginate(10))
->withPagination();
Override default exception responses:
// In App/Exceptions/Handler.php
public function render($request, Throwable $exception)
{
return ApiResponse::error('Unauthorized', [], 401);
}
Extend the base response class:
class CustomResponse extends ApiResponse
{
public function withCustomData(array $data)
{
return $this->withData(['custom' => $data]);
}
}
Use closures for lazy-loaded metadata:
return ApiResponse::success($data)
->withMeta(fn() => ['count' => User::count()]);
Leverage middleware to set version-specific responses:
// In routes/api.php
Route::middleware(['api-version' => 'v1'])->group(...);
Mock responses in tests:
$response = $this->get('/users')
->assertJsonStructure([
'data' => [],
'meta' => [],
'links' => [],
]);
Pagination Conflicts
withPagination(), ensure your collection/length-aware paginator is properly configured.ApiResponse::success(User::paginate(10))->withPagination(User::paginate(10));
Caching Headers
ApiResponse::success($data)->disableCaching();
Swagger/Postman Export
stackmasteraliza/laravel-api-docs (separate package). Ensure both are installed:
composer require stackmasteraliza/laravel-api-docs
Trait Method Conflicts
RespondsWithApiResponse trait, avoid naming controller methods success() or error() to prevent conflicts.Status Code Overrides
ApiResponse::error('Not Found', [], 404);
Response Inspection
Use dd() to inspect the response object before sending:
$response = ApiResponse::success($data)->withMeta(['debug' => true]);
dd($response->toArray());
Config Overrides
Temporarily override config in bootstrap/app.php:
$app->bind('api-response', fn() => new \Stackmasteraliza\ApiResponse\ApiResponse([
'default_status' => 200,
'include_links' => false,
]));
Middleware Debugging Check if middleware is interfering with responses:
// In App/Http/Kernel.php
protected $middleware = [
// Disable ApiResponseMiddleware temporarily
];
Custom Response Formats
Override the render() method in a service provider:
ApiResponse::macro('customFormat', function($data) {
return $this->withData(['formatted' => $data]);
});
Global Meta Data Add default meta data via config:
'default_meta' => [
'api_version' => '1.0.0',
'timestamp' => now()->toIso8601String(),
],
Exception Mappings
Extend exception handling in App/Exceptions/Handler.php:
public function register()
{
ApiResponse::extendExceptionHandling(function($request, Throwable $exception) {
if ($exception instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) {
return ApiResponse::error('Resource not found', [], 404);
}
});
}
Localization Customize error messages via language files:
// resources/lang/en/api.php
'errors' => [
'validation' => 'The given data failed validation.',
],
Performance Optimization Disable unnecessary features in production:
// config/api-response.php
'debug' => env('APP_DEBUG', false),
'include_links' => env('API_INCLUDE_LINKS', false),
How can I help you explore Laravel packages today?