Спрощення обробки потоків за допомогою методу resource у Laravel

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

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

Раніше перетворення HTTP-відповідей у потоки вимагало кількох кроків та додаткових імпортів:

$response = Http::get($documentUrl);
$stream = StreamWrapper::getResource($response->toPsrResponse()->getBody());
Storage::writeStream('document.pdf', $stream);

Тепер новий підхід зводить це до одного виклику методу, що робить обробку потоків більш інтуїтивною та зрозумілішою.

$response = Http::get($documentUrl);
Storage::writeStream('document.pdf', $response->resource());

Ось приклад сервісу резервного копіювання, який демонструє практичне застосування потоків:

class BackupService
{
    public function downloadRemoteBackup(string $backupUrl, string $destinationPath)
    {
        try {
            $this->validateBackupUrl($backupUrl);
 
            $response = Http::timeout(300)->get($backupUrl);
 
            if ($response->failed()) {
                throw new BackupDownloadException("Не вдалося отримати резервну копію з {$backupUrl}");
            }
 
            $fileSize = $response->header('Content-Length');
            $this->logBackupStart($backupUrl, $fileSize);
 
            Storage::disk('backups')->writeStream(
                $destinationPath,
                $response->resource()
            );
 
            $this->verifyBackupIntegrity($destinationPath, $fileSize);
            $this->logBackupCompletion($destinationPath);
 
            return true;
 
        } catch (Exception $e) {
            $this->logBackupError($backupUrl, $e->getMessage());
            throw new BackupProcessingException("Операція резервного копіювання не вдалася: {$e->getMessage()}");
        }
    }
 
    public function syncMediaLibrary(array $mediaUrls)
    {
        $results = [];
 
        foreach ($mediaUrls as $url) {
            $filename = basename(parse_url($url, PHP_URL_PATH));
 
            try {
                $response = Http::get($url);
 
                if ($response->successful()) {
                    Storage::disk('media')->writeStream(
                        "library/{$filename}",
                        $response->resource()
                    );
 
                    $results[$url] = 'успішно';
                } else {
                    $results[$url] = 'не вдалося';
                }
 
            } catch (Exception $e) {
                $results[$url] = 'помилка: ' . $e->getMessage();
            }
        }
 
        return $results;
    }
 
    private function validateBackupUrl(string $url)
    {
        if (!filter_var($url, FILTER_VALIDATE_URL)) {
            throw new InvalidArgumentException("Неправильний URL-адрес резервної копії");
        }
    }
 
    private function verifyBackupIntegrity(string $path, $expectedSize)
    {
        $actualSize = Storage::disk('backups')->size($path);
 
        if ($expectedSize & $actualSize !== (int) $expectedSize) {
            throw new BackupIntegrityException("Несумісність розміру файлу під час перевірки резервної копії");
        }
    }
}

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