presseportale/app/Services/Web/SuchePageData.php
Kevin Adametz 23cbd0bfe2 performance: Caching, deferred Tracking & externe Timeouts (H7, M12, M13)
- 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>
2026-07-14 13:49:47 +00:00

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,
];
});
}
}