manager = new ImageManager(new Driver()); } /** * Сохраняет загруженный файл, возвращает путь относительно диска 'public'. * Например: 'blocks/steps_section/550e8400-e29b-41d4-a716-446655440000.webp' * * @param array{width?:int, height?:int} $fieldDef — определение поля из BlockLayoutRegistry */ public function store(UploadedFile $file, string $folder, array $fieldDef = []): string { $image = $this->manager->read($file->getRealPath()); $w = $fieldDef['width'] ?? null; $h = $fieldDef['height'] ?? null; if ($w && $h) { // Cover-кроп: обрезаем по центру до точных размеров $image->cover($w, $h); } elseif ($w) { // Масштабируем до ширины (не увеличиваем) $image->scaleDown(width: $w); } else { // По умолчанию: не шире 1200px $image->scaleDown(width: 1200); } $filename = Str::uuid() . '.webp'; $path = "blocks/{$folder}/{$filename}"; Storage::disk('public')->put($path, $image->toWebp(85)); return $path; } /** * Удаляет старый файл из диска 'public', если это внутренний файл (не внешний URL). */ public function delete(string $oldPath): void { if ($oldPath && !str_starts_with($oldPath, 'http') && Storage::disk('public')->exists($oldPath)) { Storage::disk('public')->delete($oldPath); } } }