Laravel надає потужні інструменти для аналізу уподобань типів контенту клієнтів через заголовок Accept. Ці методи дозволяють реалізувати складні стратегії узгодження контенту у ваших додатках.
Laravel пропонує два основні методи для перевірки типів контенту:
$allTypes = $request->getAcceptableContentTypes();
$canHandle = $request->accepts(['application/json', 'text/html']);
Перший метод повертає всі прийнятні типи контенту, тоді як другий перевіряє, чи приймає запит один із зазначених вами типів.
class ProductController extends Controller
{
public function catalog(Request $request)
{
$products = Product::with('category')->paginate(20);
$acceptedTypes = $request->getAcceptableContentTypes();
if ($request->accepts(['application/json'])) {
return response()->json([
'products' => $products->items(),
'pagination' => [
'current_page' => $products->currentPage(),
'total_pages' => $products->lastPage(),
'per_page' => $products->perPage()
]
]);
}
if ($request->accepts(['application/xml'])) {
return response()
->view('products.xml', compact('products'))
->header('Content-Type', 'application/xml');
}
if ($request->accepts(['text/csv'])) {
$csvData = $this->generateProductCsv($products);
return response($csvData)
->header('Content-Type', 'text/csv')
->header('Content-Disposition', 'attachment; filename="products.csv"');
}
return view('products.catalog', compact('products'));
}
public function details(Request $request, Product $product)
{
$supportedFormats = ['application/json', 'text/html', 'application/pdf'];
if (!$request->accepts($supportedFormats)) {
return response()->json([
'error' => 'Unsupported content type',
'supported' => $supportedFormats
], 406);
}
if ($request->accepts(['application/json'])) {
return response()->json([
'product' => $product->load(['reviews', 'specifications']),
'related_products' => $product->getRelatedProducts(5),
'average_rating' => $product->reviews->avg('rating')
]);
}
if ($request->accepts(['application/pdf'])) {
$pdf = $this->generateProductPdf($product);
return response($pdf)
->header('Content-Type', 'application/pdf')
->header('Content-Disposition', 'inline; filename="product-' . $product->id . '.pdf"');
}
return view('products.details', compact('product'));
}
private function generateProductCsv($products)
{
$output = "ID,Name,Price,Category,Stock\n";
foreach ($products as $product) {
$output .= sprintf(
"%d,%s,%.2f,%s,%d\n",
$product->id,
$product->name,
$product->price,
$product->category->name,
$product->stock_quantity
);
}
return $output;
}
private function generateProductPdf(Product $product)
{
$pdf = new ProductPdfGenerator();
return $pdf->generate($product);
}
}
Ці методи перевірки контенту дозволяють динамічно формувати відповіді залежно від можливостей клієнта, що робить застосунки більш універсальними та зручними для користувачів