Метод prefers
у Laravel спрощує домовленість про формат контенту, визначаючи, який формат клієнти бажають отримати з ваших доступних опцій. Це дозволяє створювати гнучкі кінцеві точки, які безперешкодно обслуговують кілька типів контенту.
Метод оцінює заголовок Accept клієнта у відповідності з підтримуваними вами форматами:
$contentType = $request->prefers(['application/json', 'text/html']);
Якщо клієнт приймає один з визначених вами типів, повертається саме цей тип. Якщо ні — ви отримаєте null для подальшої обробки.
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'));
}
Ось детальна система звітності, яка демонструє розширену домовленість про контент:
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()
];
}
}
Домовленість про контент через метод prefers
дозволяє розробляти надійні API, які відповідають різноманітним вимогам клієнтів, зберігаючи при цьому чистоту та підтримуваність коду