Спрощене оброблення стрім-відповідей у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 18 січня, 2025
Ефективна робота з HTTP-стрімами в Laravel стала ще простішою завдяки новому методу `resource()`. Досліджуйте, як цей інструмент перетворює складні завдання завантаження файлів на прості завдання, зменшуючи обсяг коду та підвищуючи продуктивність вашого додатку!

Керування HTTP-стрімами у Laravel традиційно вимагало кількох кроків та перетворень, особливо під час завантаження чи передачі файлів. Проте новий метод resource() значно спрощує цей процес, дозволяючи виконувати складні операції з потоками за допомогою одного виклику методу.

Цей метод особливо корисний для завантаження файлів з зовнішніх джерел і їх зберігання у системі зберігання вашого додатка, уникаючи необхідності створювати тимчасові файли або виконувати складні перетворення потоків.

use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;

// Старий підхід вимагав кількох перетворень
$response = Http::get($url);
Storage::put('file.pdf', StreamWrapper::getResource(
    $response->toPsrResponse()->getBody()
));

// Новий спрощений підхід
Storage::put('file.pdf', Http::get($url)->resource());

Розглянемо практичний приклад сервісу обробки документів:

<?php

namespace App\Services;

use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use App\Exceptions\DocumentProcessingException;

class DocumentProcessor
{
    public function processRemoteDocument(string $documentUrl, string $reference)
    {
        try {
            $response = Http::timeout(30)->get($documentUrl);

            if (!$response->successful()) {
                throw new DocumentProcessingException(
                    "Не вдалося отримати документ: {$response->status()}"
                );
            }
            // Зберегти оригінальний документ
            $originalPath = "documents/{$reference}/original.pdf";
            Storage::put($originalPath, $response->resource());
            // Створити резервну копію
            Storage::disk('backup')->writeStream(
                $originalPath,
                Storage::readStream($originalPath)
            );
            return [
                'reference' => $reference,
                'size' => Storage::size($originalPath),
                'path' => $originalPath
            ];
        } catch (Exception $e) {
            Log::error('Обробка документа не вдалася', [
                'url' => $documentUrl,
                'reference' => $reference,
                'error' => $e->getMessage()
            ]);

            throw $e;
        }
    }
}

Метод resource() спрощує обробку потоків у додатках Laravel, роблячи операції з файлами простішими та зменшуючи складність вашого коду