slug = (string) $slug; $this->loadArticle(); $this->listUrl = $this->articleWorld() === CmsArticle::WORLD_IMMOBILIEN ? route('immobilien.magazin') : route('magazin'); $this->loadRelatedArticles(); $this->loadThemeContent(); } private function articleWorld(): string { return (string) ($this->article['world'] ?? CmsArticle::WORLD_INTERIOR); } private function loadArticle() { $articles = $this->getArticlesData(); // Unbekannte Slugs haben frueher stillschweigend Artikel 1 ausgeliefert – mit Status 200. // Das erzeugt Duplicate Content unter beliebig vielen URLs. abort_unless(isset($articles[$this->slug]), 404); $this->article = $articles[$this->slug]; } private function loadRelatedArticles() { $this->relatedArticles = collect($this->getArticlesData()) ->filter(fn (array $article) => ($article['world'] ?? CmsArticle::WORLD_INTERIOR) === $this->articleWorld()) ->reject(fn (array $article, string $slug) => $slug === $this->slug) ->take(2) ->values() ->toArray(); } private function loadThemeContent() { $this->content = cms_theme_section('magazin_detail'); } /** @var array>|null */ private ?array $articlesCache = null; /** * Wird beim Rendern zweimal gebraucht (Artikel + verwandte Artikel) – deshalb gemerkt, * damit die Detailseite nur eine Abfrage auslöst. * * @return array> */ private function getArticlesData(): array { return $this->articlesCache ??= CmsArticle::forFrontend(); } public function render() { return view('livewire.web.components.sections.magazin-detail', [ 'article' => $this->article, 'relatedArticles' => $this->relatedArticles, ]); } }