Laravel Tutorials

Simplifying Stream Handling with Laravel's resource Method

Published
Simplifying Stream Handling with Laravel's resource Method image

Laravel's HTTP Client now includes a resource() method that streamlines working with response streams, eliminating the verbose setup previously required for stream operations.

Before this enhancement, converting HTTP responses to streams required multiple steps and additional imports:

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

The new approach reduces this to a single method call, making stream handling more intuitive and readable.

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

Here's a file backup service that demonstrates practical stream usage:

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("Failed to retrieve backup from {$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("Backup operation failed: {$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] = 'success';
} else {
$results[$url] = 'failed';
}
 
} catch (Exception $e) {
$results[$url] = 'error: ' . $e->getMessage();
}
}
 
return $results;
}
 
private function validateBackupUrl(string $url)
{
if (!filter_var($url, FILTER_VALIDATE_URL)) {
throw new InvalidArgumentException("Invalid backup URL provided");
}
}
 
private function verifyBackupIntegrity(string $path, $expectedSize)
{
$actualSize = Storage::disk('backups')->size($path);
 
if ($expectedSize && $actualSize !== (int) $expectedSize) {
throw new BackupIntegrityException("File size mismatch during backup verification");
}
}
}

The resource() method simplifies file operations and reduces boilerplate code when working with HTTP response streams in Laravel applications.

Harris Raftopoulos photo

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

Sponsored

acquaintsoft logo
Acquaint Softtech

Hire Laravel developers with AI expertise at $20/hr. Get started in 48 hours.

Visit Acquaint Softtech

The latest

View all →
Run Large PlanetScale Queries in Laravel With DB::olap() image

Run Large PlanetScale Queries in Laravel With DB::olap()

Read article
Fluent Rule Builders for All Laravel Validation Rules image

Fluent Rule Builders for All Laravel Validation Rules

Read article
Laravel URL AI Transformer: Extract Structured Data From URLs image

Laravel URL AI Transformer: Extract Structured Data From URLs

Read article
Rule Builders for Every Validation Rule in Laravel 13.36 image

Rule Builders for Every Validation Rule in Laravel 13.36

Read article
PHP News: A New Site for PHP Releases, RFCs, and Packages image

PHP News: A New Site for PHP Releases, RFCs, and Packages

Read article
Pause Polling in Background Tabs in Inertia.js v3.9 image

Pause Polling in Background Tabs in Inertia.js v3.9

Read article