From 64e4a9fefb92cfacc7dc2459a8d4b3407d184144 Mon Sep 17 00:00:00 2001 From: mscherer Date: Mon, 12 Jan 2026 08:05:26 +0100 Subject: [PATCH] Fix TypeError in CacheEventListener when event type mismatches Use defensive runtime type checking instead of strict PHP type hints for cache event handlers. This prevents TypeErrors when the dispatched event class doesn't match the expected type due to edge cases in CakePHP's cache event dispatching. The fix: - Changes parameter types from specific event classes to EventInterface - Adds instanceof checks at the start of each handler - Returns early if the event type doesn't match expectations This is a defensive programming approach that handles potential inconsistencies in the event system gracefully. --- src/Event/CacheEventListener.php | 43 +++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/src/Event/CacheEventListener.php b/src/Event/CacheEventListener.php index 96da680..01d4a45 100644 --- a/src/Event/CacheEventListener.php +++ b/src/Event/CacheEventListener.php @@ -9,6 +9,7 @@ use Cake\Cache\Event\CacheAfterIncrementEvent; use Cake\Cache\Event\CacheAfterSetEvent; use Cake\Cache\Event\CacheClearedEvent; +use Cake\Event\EventInterface; use Cake\Event\EventListenerInterface; use Cake\I18n\DateTime; use DateInterval; @@ -33,21 +34,27 @@ public function implementedEvents(): array } /** - * @param \Cake\Cache\Event\CacheAfterGetEvent $event + * @param \Cake\Event\EventInterface $event * @return void */ - public function onCacheAfterGet(CacheAfterGetEvent $event): void + public function onCacheAfterGet(EventInterface $event): void { + if (!$event instanceof CacheAfterGetEvent) { + return; + } $value = $this->serializedEventValue($event->getValue()); $this->addGetSpan($event->getKey(), $value); } /** - * @param \Cake\Cache\Event\CacheAfterSetEvent $event + * @param \Cake\Event\EventInterface $event * @return void */ - public function onCacheAfterSet(CacheAfterSetEvent $event): void + public function onCacheAfterSet(EventInterface $event): void { + if (!$event instanceof CacheAfterSetEvent) { + return; + } $ttl = $event->getTtl(); if ($ttl instanceof DateInterval) { $now = new DateTime(); @@ -59,11 +66,14 @@ public function onCacheAfterSet(CacheAfterSetEvent $event): void } /** - * @param \Cake\Cache\Event\CacheAfterAddEvent $event + * @param \Cake\Event\EventInterface $event * @return void */ - public function onCacheAfterAdd(CacheAfterAddEvent $event): void + public function onCacheAfterAdd(EventInterface $event): void { + if (!$event instanceof CacheAfterAddEvent) { + return; + } $ttl = $event->getTtl(); if ($ttl instanceof DateInterval) { $now = new DateTime(); @@ -75,30 +85,39 @@ public function onCacheAfterAdd(CacheAfterAddEvent $event): void } /** - * @param \Cake\Cache\Event\CacheAfterIncrementEvent $event + * @param \Cake\Event\EventInterface $event * @return void */ - public function onCacheAfterIncrement(CacheAfterIncrementEvent $event): void + public function onCacheAfterIncrement(EventInterface $event): void { + if (!$event instanceof CacheAfterIncrementEvent) { + return; + } $value = $this->serializedEventValue($event->getValue()); $this->addPutSpan($event->getKey(), $value); } /** - * @param \Cake\Cache\Event\CacheAfterDeleteEvent $event + * @param \Cake\Event\EventInterface $event * @return void */ - public function onCacheAfterDelete(CacheAfterDeleteEvent $event): void + public function onCacheAfterDelete(EventInterface $event): void { + if (!$event instanceof CacheAfterDeleteEvent) { + return; + } $this->addRemoveSpan($event->getKey()); } /** - * @param \Cake\Cache\Event\CacheClearedEvent $event + * @param \Cake\Event\EventInterface $event * @return void */ - public function onCacheCleared(CacheClearedEvent $event): void + public function onCacheCleared(EventInterface $event): void { + if (!$event instanceof CacheClearedEvent) { + return; + } $this->addClearSpan(); }