quonain/smart-response
SmartResponse is a Laravel package that returns JSON API responses or Blade/Inertia views from the same controller method, auto-detecting request type (Accept header, /api routes, bearer tokens). Includes pagination, response shortcuts, macros, caching, and meta enrichment.
Installation:
composer require quonain/smart-response
Publish the config (optional):
php artisan vendor:publish --provider="Quonain\SmartResponse\SmartResponseServiceProvider"
First Use Case: Replace a standard controller method with a unified response:
use Quonain\SmartResponse\Facades\SmartResponse;
public function index()
{
$data = ['users' => User::all()];
return SmartResponse::make($data);
}
{"users": [...]})$data passed to the view.config/smart-response.php (customize detection logic, default view, etc.)SmartResponse::make() for unified responses.SmartResponseMiddleware for automatic detection.Single Controller Method:
public function show($id)
{
$user = User::findOrFail($id);
return SmartResponse::make([
'user' => $user,
'meta' => ['status' => 'active']
]);
}
meta field.$user and $meta to the default view (e.g., users.show).View Overrides: Specify a custom view for web responses:
return SmartResponse::make($data)->view('custom.users.show');
/api/ for automatic JSON detection.SmartResponse::make() for SPA responses.SmartResponse::paginate() for API pagination:
return SmartResponse::paginate(User::paginate(10));
SmartResponseMiddleware to your web/api routes:
Route::middleware(['web', 'smart.response'])->group(function () {
// Routes here
});
SmartResponse::make(), SmartResponse::paginate().smartResponse(), smartPaginate() (if enabled in config).Extend responses dynamically:
\Quonain\SmartResponse\Facades\SmartResponse::macro('success', function ($data) {
return $this->make($data)->withStatus(200)->withMeta(['success' => true]);
});
Usage:
return SmartResponse::success(['message' => 'Done']);
Detection Logic Conflicts:
Accept: application/json is sent but the route is /web/..., the package may misdetect. Override detection in config:
'detection' => [
'headers' => ['Accept' => 'application/json'],
'routes' => ['prefix' => 'api'],
'custom' => function ($request) {
return $request->expectsJson() || $request->bearerToken();
}
],
View Not Found:
config('smart-response.default_view')) exists. For Inertia, set:
'default_view' => 'layouts.app', // Inertia's default layout
Caching API Responses:
SmartResponse::cache() for API responses:
return SmartResponse::make($data)->cache(60); // Cache for 60 mins
Log Detection: Enable debug mode in config:
'debug' => env('SMART_RESPONSE_DEBUG', false),
Check Laravel logs for detection details.
Override Detection: Temporarily force a response type:
return SmartResponse::make($data)->forceJson(); // Force JSON
// or
return SmartResponse::make($data)->forceView(); // Force Blade/Inertia
Custom Response Classes:
Extend Quonain\SmartResponse\SmartResponse to add methods:
namespace App\Extensions;
use Quonain\SmartResponse\SmartResponse as BaseResponse;
class CustomResponse extends BaseResponse {
public function customMethod() {
return $this->withMeta(['custom' => true]);
}
}
Use via facade:
SmartResponse::setCustomClass(CustomResponse::class);
Event Listeners:
Listen for smart.response.sent events to log or modify responses:
\Event::listen('smart.response.sent', function ($response) {
\Log::info('Response sent:', ['type' => $response->isJson() ? 'API' : 'Web']);
});
Route::middleware(['smart.response:skip'])->group(function () {
// Routes where detection is disabled
});
return SmartResponse::make($data)->lazyView(function () {
return view('heavy.view')->with('data', $data);
});
SmartResponse::throttle() to apply rate limits:
return SmartResponse::make($data)->throttle('api', 60); // 60 requests/min
Configure keys in config/smart-response.php:
'rate_limits' => [
'api' => 'api|60',
],
How can I help you explore Laravel packages today?