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.