coverImage($pressRelease); if (! $image) { return $this->placeholderUrl($pressRelease); } foreach ($this->fallbackChain($variant) as $key) { $url = $image->variantUrl($key); if ($url !== null) { return $url; } } return $image->url() ?? $this->placeholderUrl($pressRelease); } /** * Fallback-Reihenfolge der Bild-Varianten, beginnend bei der gewünschten. * * @return list */ private function fallbackChain(string $preferred): array { $chain = [$preferred, 'cover', 'large', 'medium', 'thumb']; return array_values(array_unique($chain)); } /** * Ob für diese PM nur ein Platzhalter (kein echtes Bild) vorliegt. */ public function coverIsPlaceholder(PressRelease $pressRelease): bool { return $this->coverImage($pressRelease) === null; } /** * Die Platzhalter-Variante dieser PM (mit Default-Fallback). */ public function placeholder(PressRelease $pressRelease): PressReleasePlaceholder { $variant = $pressRelease->placeholder_variant; if ($variant instanceof PressReleasePlaceholder) { return $variant; } return PressReleasePlaceholder::fromValueOrDefault($variant); } private function placeholderUrl(PressRelease $pressRelease): string { return asset($this->placeholder($pressRelease)->path()); } private function coverImage(PressRelease $pressRelease): ?PressReleaseImage { $images = $pressRelease->relationLoaded('images') ? $pressRelease->images : $pressRelease->images()->orderByDesc('is_preview')->orderBy('sort_order')->get(); return $images->firstWhere('is_preview', true) ?? $images->first(); } }