Laravel Tutorials

Laravel Request Content Type Inspection Methods

Published
Laravel Request Content Type Inspection Methods image

Laravel provides robust tools for examining client content type preferences through the Accept header. These methods enable sophisticated content negotiation strategies in your applications.

Laravel offers two key methods for content type inspection:

$allTypes = $request->getAcceptableContentTypes();
 
$canHandle = $request->accepts(['application/json', 'text/html']);

The first method returns all accepted content types, while the second checks if the request accepts any from your specified list.

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);
}
}

These content inspection methods enable dynamic response formatting based on client capabilities, creating more versatile and user-friendly applications.

Harris Raftopoulos photo

Senior Software Engineer • Staff & Educator @ Laravel News • Co-organizer @ Laravel Greece Meetup

Sponsored

laravelcloud logo
Laravel Cloud

Easily create and manage your servers and deploy your Laravel applications in seconds.

Visit Laravel Cloud

The latest

View all →
CPX: The Composer Package Executor for PHP image

CPX: The Composer Package Executor for PHP

Read article
Laravel AI SDK Adds Human-in-the-Loop Tool Approval image

Laravel AI SDK Adds Human-in-the-Loop Tool Approval

Read article
Pest 5 Released With Test Impact Analysis, Agent Verification, and Evals image

Pest 5 Released With Test Impact Analysis, Agent Verification, and Evals

Read article
Queue-SQL: Run Mass Deletes and Updates Across Parallel Queue Jobs image

Queue-SQL: Run Mass Deletes and Updates Across Parallel Queue Jobs

Read article
Blade Formatting in Laravel Pint image

Blade Formatting in Laravel Pint

Read article
Inertia DevTools Is Now on the Chrome Web Store image

Inertia DevTools Is Now on the Chrome Web Store

Read article