Методи перевірки типу вмісту запитів у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 08 липня, 2025
У Laravel є потужні інструменти для визначення переважного типу контенту клієнта за допомогою заголовка Accept, що відкриває нові горизонти для вашого додатку. Дізнайтеся, як ці методи допомагають реалізувати складні стратегії узгодження контенту і підвищити зручність користування вашими розробками!

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

Ці методи перевірки контенту дозволяють динамічно формувати відповіді залежно від можливостей клієнта, що робить застосунки більш універсальними та зручними для користувачів