*/ public function items(Portal $portal, string $language): array { $cacheKey = sprintf('web.ticker.%s.%s', $portal->value, $language); return Cache::remember($cacheKey, self::CACHE_TTL_SECONDS, function () use ($portal, $language): array { return PressRelease::query() ->forPortalValues([$portal->value, Portal::Both->value]) ->forLanguage($language) ->visibleInArchive() ->orderByDesc('published_at') ->limit(8) ->get(['id', 'title', 'slug', 'published_at']) ->map(static fn (PressRelease $release): array => [ 'time' => $release->published_at?->format('H:i') ?? '', 'text' => Str::limit((string) $release->title, 70), // Relativ, damit der gecachte Eintrag host-unabhängig bleibt // (der Header rendert auf allen Hosts des Portals identisch). 'href' => $release->slug ? route('release.detail', ['slug' => $release->slug, 'edition' => $language], absolute: false) : null, ]) ->all(); }); } }