public function getTemporaryUrl($expiresInMinutes = 15): string { return Storage::disk($this->disk)->temporaryUrl($this->path, now()->addMinutes($expiresInMinutes)); } } Create a dedicated service to orchestrate PDF storage across drivers.
class PDFDocument extends Model { use SoftDeletes; protected $fillable = ['title', 'filename', 'disk', 'path', 'size', 'metadata', 'share_token', 'expires_at']; protected $casts = ['metadata' => 'array', 'expires_at' => 'datetime']; laravel pdfdrive
return Storage::disk($pdf->disk)->response($pdf->path); } $path = $file->
Storage::disk($disk)->put($path, $content); return PDFDocument::create([ 'user_id' => $userId, 'title' => $title, 'filename' => $filename, 'disk' => $disk, 'path' => $path, 'size' => Storage::disk($disk)->size($path), 'mime_type' => 'application/pdf', 'metadata' => $metadata, ]); } return PDFDocument::create([ 'user_id' =>
Route::middleware('auth')->group(function () { Route::resource('pdfs', PDFController::class); Route::post('pdfs/generate-from-view', [PDFController::class, 'generateFromView'])->name('pdfs.generate'); Route::put('pdfs/{pdf}/move', [PDFController::class, 'moveDisk'])->name('pdfs.move'); }); Route::get('share/pdf/{token}', [PDFController::class, 'share'])->name('pdf.share'); 7.1. Queue PDF Generation for Large Reports Don't block HTTP requests. Dispatch a job:
public function storeFromUpload(UploadedFile $file, string $title, int $userId, array $metadata = []): PDFDocument { if ($file->getClientMimeType() !== 'application/pdf') { throw new \Exception('Only PDF files are allowed'); } $disk = config('pdfdrive.default_disk', 'local'); $originalName = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME); $filename = Str::slug($originalName) . '_' . time() . '.pdf'; $path = $file->storeAs('pdfs', $filename, $disk); return PDFDocument::create([ 'user_id' => $userId, 'title' => $title, 'filename' => $filename, 'disk' => $disk, 'path' => $path, 'size' => $file->getSize(), 'metadata' => $metadata, ]); }