jooservices / laravel-controller
Laravel API controller foundation for standardized JSON responses, pagination, status endpoints, trace IDs, and custom formatters.
Requires
- php: ^8.5
- illuminate/http: ^12.0
- illuminate/routing: ^12.0
- illuminate/support: ^12.0
Requires (Dev)
- captainhook/captainhook: ^5.23
- captainhook/plugin-composer: ^5.3
- laravel/pint: ^1.0
- orchestra/testbench: ^10.0
- phpmd/phpmd: ^2.15
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^12.0
- squizlabs/php_codesniffer: ^3.7
- dev-develop
- 1.2.0
- 1.1.0
- 1.0.0
- dev-feature/dto-level-hardening
- dev-dependabot/composer/phpstan/phpstan-2.1.54
- dev-dependabot/composer/squizlabs/php_codesniffer-4.0.1
- dev-dependabot/composer/phpunit/phpunit-13.1.7
- dev-dependabot/composer/laravel/pint-1.29.1
- dev-dependabot/github_actions/softprops/action-gh-release-3
- dev-feat/response-formatter-and-ci
- dev-release/1.1.0
This package is auto-updated.
Last update: 2026-05-06 06:10:05 UTC
README
JOOservices Laravel Controller is a Laravel API controller foundation for standardized JSON response envelopes, resource-friendly helpers, pagination metadata, status endpoints, trace IDs, and formatter-based response customization.
Composer package: jooservices/laravel-controller
Features
- base API controller helpers for success, error, validation, status, and no-content responses
- Laravel
JsonResourceandResourceCollectionfriendly response helpers - standardized response envelope with configurable keys
- length-aware, cursor, and offset pagination helpers
- trace ID support through a configurable request header
- optional status endpoint with version, environment, maintenance, and health-check metadata
- custom
ResponseFormattercontract for teams that need a different top-level JSON shape - optional exception response helper for common Laravel exceptions
- read-only
php artisan laravel-controller:doctordiagnostics
Installation
composer require jooservices/laravel-controller
Publish Config
php artisan vendor:publish --provider="JOOservices\LaravelController\Providers\LaravelControllerServiceProvider" --tag="config"
Optional translations:
php artisan vendor:publish --provider="JOOservices\LaravelController\Providers\LaravelControllerServiceProvider" --tag="laravel-controller-lang"
Quick Start
Use the package at the controller boundary. Keep request validation, business logic, and persistence in your application layers:
<?php namespace App\Http\Controllers\Api\V1; use App\Http\Requests\UserIndexRequest; use App\Http\Resources\UserResource; use App\Services\UserService; use Illuminate\Http\JsonResponse; use JOOservices\LaravelController\Http\Controllers\BaseApiController; final class UserController extends BaseApiController { public function index(UserIndexRequest $request, UserService $users): JsonResponse { return $this->respondWithPagination( paginator: $users->paginate($request->validated()), resourceClass: UserResource::class, message: 'Users retrieved successfully.', ); } }
Standard Architecture Usage
Recommended flow:
Request -> Controller -> FormRequest -> Service -> Repository -> Model
Model / entity / data object -> Laravel Resource -> API response envelope -> JsonResponse
Laravel Resource remains the presentation transformer. JOOservices Laravel Controller wraps the transformed payload in the API response envelope.
Response Envelope Example
{
"success": true,
"code": 200,
"message": "Users retrieved successfully.",
"data": [],
"meta": {},
"errors": null,
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}
Resource Example
public function show(UserShowRequest $request, UserService $users): JsonResponse { return $this->respondWithResource( resource: new UserResource($users->findForDisplay($request->validated('id'))), message: 'User retrieved successfully.', ); }
DTOs, Arrayable, JsonSerializable, and objects with toArray() may be accepted as input data, but they do not replace Laravel Resources as the presentation layer.
Pagination Example
public function index(UserIndexRequest $request, UserService $users): JsonResponse { return $this->respondWithPagination( paginator: $users->paginate($request->validated()), resourceClass: UserResource::class, message: 'Users retrieved successfully.', ); }
Error Response Example
public function archive(UserArchiveRequest $request, UserService $users): JsonResponse { if (! $users->canArchive($request->validated('id'))) { return $this->respondWithError( message: 'User cannot be archived.', code: 409, errors: ['user' => ['The user has active dependencies.']], ); } $users->archive($request->validated('id')); return $this->respondNoContent(); }
Status Endpoint
When package routes are enabled, the status endpoint is available under the configured prefix:
GET /api/v1/status
Run diagnostics from the CLI:
php artisan laravel-controller:doctor php artisan laravel-controller:doctor --json
Custom Formatter
<?php namespace App\Support; use JOOservices\LaravelController\Contracts\ResponseFormatter; final class ApiResponseFormatter implements ResponseFormatter { public function format(array $response): array { return [ 'ok' => $response['success'], 'status' => $response['code'], 'message' => $response['message'], 'payload' => $response['data'], 'error' => $response['errors'], 'request_id' => $response['trace_id'], ]; } }
Configuration
Important config keys:
response_formatterkeystrace_id.headeruse_translationsenvelope_204success_codesvalidation.messageroutes.enabledroutes.prefixstatuspagination_linksitem_links
Current Limitations And Non-Goals
This package is:
- base API controller helpers
- standard response envelope helpers
- pagination and status response helpers
- formatter contract
- optional exception response helper
This package is not:
- CRUD generator
- service layer replacement
- repository replacement
- validation package
- full application exception-handler framework
- JSON:API full implementation
- business logic layer
Documentation
AI Contributor Support
Development Commands
composer lint
composer lint:all
composer lint:fix
composer test
composer test:coverage
composer check
composer ci
Security And Contributing
Use GitHub issues for bug reports and security coordination unless a dedicated security policy is added.
License
JOOservices Laravel Controller is open-sourced software licensed under the MIT license.