getOriginal('status') === 'publish'; $isPublished = $content->status === 'publish'; // Purge if: newly published OR was already published and content changed if ($isPublished && (! $wasPublished || $this->hasContentChanged($content))) { $this->queuePurge($content); } } /** * Handle the ContentItem "created" event. * * Purges CDN cache if content is created in published state. */ public function created(ContentItem $content): void { if ($content->status === 'publish') { $this->queuePurge($content); } } /** * Handle the ContentItem "deleted" event. * * Purges CDN cache when published content is deleted. */ public function deleted(ContentItem $content): void { if ($content->status === 'publish') { $this->queuePurge($content); } } /** * Check if content fields that affect the public page have changed. */ protected function hasContentChanged(ContentItem $content): bool { $watchedFields = [ 'title', 'slug', 'content_html', 'content_html_clean', 'content_markdown', 'excerpt', 'featured_media_id', 'seo_meta', ]; foreach ($watchedFields as $field) { if ($content->isDirty($field)) { return true; } } return false; } /** * Queue the CDN purge operation. * * Currently runs synchronously, but could be dispatched to queue * for better performance if needed. */ protected function queuePurge(ContentItem $content): void { try { $this->cdnPurge->purgeContent($content); } catch (\Exception $e) { // Log but don't fail the save operation Log::error('ContentItemObserver: CDN purge failed', [ 'content_id' => $content->id, 'error' => $e->getMessage(), ]); } } }