Переговори щодо контенту за допомогою методу prefers у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 05 липня, 2025
Метод `prefers` в Laravel спрощує переговори про типи контенту, визначаючи, який формат бажає клієнт серед запропонованих вами варіантів. Дізнайтеся, як за допомогою цього методу створити гнучкі ендпоінти, які підтримують різноманітні формати, що відповідають вимогам ваших користувачів

Метод 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, які відповідають різноманітним вимогам клієнтів, зберігаючи при цьому чистоту та підтримуваність коду