- Navigations-Chrome (CategoryNavigation), Suche- und Newsroom-Seitendaten 300s gecacht; gemeinsamer WebPageCache-Helper (eine TTL/Key-Konvention). - Cache-Poisoning über ?page= geschlossen (Key an Paginator ausgerichtet, kein withQueryString im Cache); Newsrooms cachet nur den ungefilterten Fall und die ersten Seiten (kein unbegrenzter Key-Raum). - Detailseiten schreiben Hits/View-Events deferred nach der Response (M12); OpenAI-/Markt-/USt-ID-Aufrufe mit Connect-Timeouts und begrenzten Retries; Admin-Memo-Caches konsistent invalidiert. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
45 lines
1.4 KiB
PHP
45 lines
1.4 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Web;
|
|
|
|
use App\Models\PressRelease;
|
|
use App\Scopes\PortalScope;
|
|
use App\Support\WebPageCache;
|
|
use App\Support\WebPortalContext;
|
|
|
|
/**
|
|
* Datenaufbereitung der Archiv-Suchseite. Die eigentliche Suche läuft in der
|
|
* Volt-Komponente; hier wird nur die „Meistgelesen"-Seitenleiste geliefert.
|
|
*/
|
|
class SuchePageData
|
|
{
|
|
/**
|
|
* @return array<string, mixed>
|
|
*/
|
|
public function build(WebPortalContext $context): array
|
|
{
|
|
$cacheKey = WebPageCache::key('search', [
|
|
'most-read',
|
|
implode('-', $context->portalValues),
|
|
$context->language,
|
|
]);
|
|
|
|
return WebPageCache::remember($cacheKey, static function () use ($context): array {
|
|
$mostReadReleases = PressRelease::query()
|
|
->withoutGlobalScope(PortalScope::class)
|
|
->forPortalValues($context->portalValues)
|
|
->forLanguage($context->language)
|
|
->visibleInArchive()
|
|
->orderByDesc('hits')
|
|
->orderByDesc('published_at')
|
|
->limit(5)
|
|
->get(['id', 'slug', 'title', 'hits', 'portal', 'language']);
|
|
|
|
return [
|
|
'portal' => $context->portal->value,
|
|
'language' => $context->language,
|
|
'mostReadReleases' => $mostReadReleases,
|
|
];
|
|
});
|
|
}
|
|
}
|