Laravel's prefers method simplifies content type negotiation by determining which format clients want from your available options. This enables flexible endpoints that serve multiple content types seamlessly.
The method evaluates the client's Accept header against your supported formats:
$contentType = $request->prefers(['application/json', 'text/html']);
When the client accepts one of your specified types, that type is returned. Otherwise, you receive null for further handling.
public function index(Request $request){ $products = Product::paginate(15); $preferred = $request->prefers(['application/json', 'text/html']); if ($preferred === 'application/json') { return response()->json($products); } return view('products.index', compact('products'));}
Here's a comprehensive reporting system that demonstrates advanced content negotiation:
class ReportController extends Controller{ public function export(Request $request, Report $report) { $supportedFormats = [ 'application/json', 'text/csv', 'application/pdf', 'application/vnd.ms-excel' ]; $preferred = $request->prefers($supportedFormats); return match($preferred) { 'application/json' => $this->exportAsJson($report), 'text/csv' => $this->exportAsCsv($report), 'application/pdf' => $this->exportAsPdf($report), 'application/vnd.ms-excel' => $this->exportAsExcel($report), default => response()->json(['error' => 'Unsupported format'], 406) }; } public function dashboard(Request $request) { $analytics = $this->gatherAnalytics(); $preferred = $request->prefers(['text/html', 'application/json', 'text/plain']); return match($preferred) { 'text/html' => view('dashboard.analytics', compact('analytics')), 'application/json' => response()->json([ 'analytics' => $analytics, 'generated_at' => now()->toISOString(), 'cache_duration' => 300 ]), 'text/plain' => response($this->formatAsPlainText($analytics)) ->header('Content-Type', 'text/plain'), default => response('Format not supported', 406) }; } private function exportAsJson(Report $report) { return response()->json([ 'report_data' => $report->data, 'metadata' => [ 'generated_at' => now(), 'report_type' => $report->type, 'record_count' => count($report->data) ] ]); } private function exportAsCsv(Report $report) { $csv = $this->generateCsvContent($report); return response($csv) ->header('Content-Type', 'text/csv') ->header('Content-Disposition', 'attachment; filename="report.csv"'); } private function gatherAnalytics() { return [ 'total_users' => User::count(), 'active_sessions' => Session::where('last_activity', '>', now()->subHour())->count(), 'revenue_today' => Order::whereDate('created_at', today())->sum('total'), 'performance_metrics' => $this->getPerformanceData() ]; }}
Content negotiation through the prefers method enables robust API design that accommodates diverse client requirements while maintaining clean, maintainable code.