@@ -33,9 +33,18 @@ class Cache
3333 NAMESPACES = 'namespaces ' ,
3434 ALL = 'all ' ;
3535
36+ public const
37+ EVENT_HIT = 'hit ' ,
38+ EVENT_MISS = 'miss ' ,
39+ EVENT_SAVE = 'save ' ,
40+ EVENT_REMOVE = 'remove ' ;
41+
3642 /** @internal */
3743 public const NAMESPACE_SEPARATOR = "\x00" ;
3844
45+ /** @var array */
46+ public $ onEvent ;
47+
3948 /** @var Storage */
4049 private $ storage ;
4150
@@ -88,8 +97,9 @@ public function load($key, callable $generator = null)
8897 {
8998 $ storageKey = $ this ->generateKey ($ key );
9099 $ data = $ this ->storage ->read ($ storageKey );
100+ $ this ->onEvent ($ this , $ data === null ? self ::EVENT_MISS : self ::EVENT_HIT , $ key );
91101 if ($ data === null && $ generator ) {
92- $ this ->storage ->lock ($ storageKey );
102+ $ this ->storage ->lock ($ storageKey );
93103 try {
94104 $ data = $ generator (...[&$ dependencies ]);
95105 } catch (\Throwable $ e ) {
@@ -134,12 +144,14 @@ public function bulkLoad(array $keys, callable $generator = null): array
134144 foreach ($ keys as $ i => $ key ) {
135145 $ storageKey = $ storageKeys [$ i ];
136146 if (isset ($ cacheData [$ storageKey ])) {
147+ $ this ->onEvent ($ this , self ::EVENT_HIT , $ key );
137148 $ result [$ key ] = $ cacheData [$ storageKey ];
138149 } elseif ($ generator ) {
139150 $ result [$ key ] = $ this ->load ($ key , function (&$ dependencies ) use ($ key , $ generator ) {
140151 return $ generator (...[$ key , &$ dependencies ]);
141152 });
142153 } else {
154+ $ this ->onEvent ($ this , self ::EVENT_MISS , $ key );
143155 $ result [$ key ] = null ;
144156 }
145157 }
@@ -165,27 +177,30 @@ public function bulkLoad(array $keys, callable $generator = null): array
165177 */
166178 public function save ($ key , $ data , array $ dependencies = null )
167179 {
168- $ key = $ this ->generateKey ($ key );
180+ $ storageKey = $ this ->generateKey ($ key );
169181
170182 if ($ data instanceof \Closure) {
171183 trigger_error (__METHOD__ . '() closure argument is deprecated. ' , E_USER_WARNING );
172- $ this ->storage ->lock ($ key );
184+ $ this ->storage ->lock ($ storageKey );
173185 try {
174186 $ data = $ data (...[&$ dependencies ]);
175187 } catch (\Throwable $ e ) {
176- $ this ->storage ->remove ($ key );
188+ $ this ->storage ->remove ($ storageKey );
177189 throw $ e ;
178190 }
179191 }
180192
181193 if ($ data === null ) {
182- $ this ->storage ->remove ($ key );
194+ $ this ->storage ->remove ($ storageKey );
195+ $ this ->onEvent ($ this , self ::EVENT_REMOVE , $ key );
183196 } else {
184197 $ dependencies = $ this ->completeDependencies ($ dependencies );
185198 if (isset ($ dependencies [self ::EXPIRATION ]) && $ dependencies [self ::EXPIRATION ] <= 0 ) {
186- $ this ->storage ->remove ($ key );
199+ $ this ->storage ->remove ($ storageKey );
200+ $ this ->onEvent ($ this , self ::EVENT_REMOVE , $ key );
187201 } else {
188- $ this ->storage ->write ($ key , $ data , $ dependencies );
202+ $ this ->storage ->write ($ storageKey , $ data , $ dependencies );
203+ $ this ->onEvent ($ this , self ::EVENT_SAVE , $ key );
189204 }
190205 return $ data ;
191206 }
0 commit comments