Paquete Laravel 12+ para formatear respuestas JSON de forma estandarizada.
Este paquete proporciona una forma consistente de estructurar las respuestas JSON para APIs Laravel, siguiendo un formato uniforme para respuestas exitosas y de error.
- PHP
8.2+ - Laravel
12+
En consola:
composer require hardcodear/api-response-serviceLaravel detectará automáticamente el ServiceProvider y registrará el alias del facade apiresponse gracias al archivo composer.json del paquete.
<?php
use Illuminate\Http\Request;
class UserController
{
public function index()
{
return apiresponse()->success('Listado de usuarios', [
['id' => 1, 'name' => 'Ana'],
['id' => 2, 'name' => 'Luis'],
]);
}
public function store(Request $request)
{
$errors = [];
if (! $request->input('email')) {
$errors['email'][] = 'El campo email es obligatorio.';
}
if ($errors !== []) {
return apiresponse()->validation('Datos inválidos', $errors);
}
return apiresponse()->success('Usuario creado', ['id' => 123]);
}
}El paquete expone los siguientes métodos a través del helper apiresponse() (o facade ApiResponse):
apiresponse()->success(string $mensaje = null, mixed $data = null)return apiresponse()->success('Operación realizada con éxito', ['id' => 123]);apiresponse()->notFound(string $mensaje = null, mixed $errores = null)return apiresponse()->notFound('Recurso no encontrado');apiresponse()->validation(string $mensaje = null, mixed $errores = null)return apiresponse()->validation('Datos inválidos', $validator->errors());apiresponse()->unauthorized(string $mensaje = null, mixed $errores = null)return apiresponse()->unauthorized('Token inválido');apiresponse()->forbidden(string $mensaje = null, mixed $errores = null)return apiresponse()->forbidden('Acceso denegado');apiresponse()->serverError(string $mensaje = null, mixed $errores = null)return apiresponse()->serverError('Error inesperado');apiresponse()->error(string $mensaje = null, mixed $errores = null)return apiresponse()->error('Error inesperado', ['detalle' => '...']);{
"status": 200,
"message": "Mensaje opcional",
"data": {
// contenido devuelto
}
}{
"status": 500,
"message": "Mensaje de error",
"errors": [
// array de errores
]
}El campo
errorspuede ser un array plano o un array asociativo (por ejemplo, errores de validación).
Cuando
dataoerrorssonnull, esas claves se omiten automáticamente del JSON.
Si querés que tu API devuelva respuestas JSON uniformes ante errores comunes como rutas no encontradas, permisos o límites de peticiones, podés usar el registrador de excepciones incluido en este paquete.
Esto te permite centralizar el manejo de errores en bootstrap/app.php, sin repetir lógica en cada controlador.
Agregá el binding dentro de withExceptions(...) en bootstrap/app.php:
use Hardcodear\ApiResponseService\ExceptionApiRegistrar;
use Illuminate\Foundation\Configuration\Exceptions;
$app->withExceptions(function (Exceptions $exceptions) {
ExceptionApiRegistrar::bind($exceptions);
});Intercepta excepciones comunes y devuelve respuestas formateadas como:
{
"status": 404,
"message": "URL no encontrada"
}Las excepciones manejadas por defecto son:
- AccessDeniedHttpException → 401 Unauthorized
- NotFoundHttpException → 404 Not Found
- TooManyRequestsHttpException → 429 Too Many Requests
- RouteNotFoundException → 401 Unauthorized
- AuthenticationException → 401 Unauthorized
- AuthorizationException → 403 Forbidden
- MethodNotAllowedHttpException → 405 Method Not Allowed
- ValidationException → 422 Unprocessable Entity
- HttpExceptionInterface (fallback) → respeta el status HTTP en rutas API
Si queres personalizar patrones de rutas y mensajes, publica la configuracion:
php artisan vendor:publish --tag=apiresponse-configArchivo publicado: config/apiresponse.php
api_patterns: patrones de ruta a interceptar (default:['api', 'api/*'])messages: mensajes por tipo de excepcion
Ejecutar la suite localmente:
composer testEl repositorio también ejecuta tests automáticamente en GitHub Actions para push y pull_request con PHP 8.2 y 8.3.
Ricardo Bazán
Argentina, 2026
Repositorio interno: https://github.com/hardcodear/api-response-service
Este paquete está licenciado bajo la MIT License.