@@ -26,24 +26,23 @@ class TagAwareAdapter implements TagAwareAdapterInterface
2626 private $ deferred = array ();
2727 private $ createCacheItem ;
2828 private $ getTagsByKey ;
29+ private $ invalidateTags ;
2930 private $ tagsAdapter ;
3031
3132 public function __construct (AdapterInterface $ itemsAdapter , AdapterInterface $ tagsAdapter = null )
3233 {
3334 $ this ->itemsAdapter = $ itemsAdapter ;
3435 $ this ->tagsAdapter = $ tagsAdapter ?: $ itemsAdapter ;
3536 $ this ->createCacheItem = \Closure::bind (
36- function ($ key , $ value = null , CacheItem $ protoItem = null ) {
37+ function ($ key , $ value , CacheItem $ protoItem ) {
3738 $ item = new CacheItem ();
3839 $ item ->key = $ key ;
3940 $ item ->value = $ value ;
4041 $ item ->isHit = false ;
41-
42- if (null !== $ protoItem ) {
43- $ item ->defaultLifetime = $ protoItem ->defaultLifetime ;
44- $ item ->innerItem = $ protoItem ->innerItem ;
45- $ item ->poolHash = $ protoItem ->poolHash ;
46- }
42+ $ item ->defaultLifetime = $ protoItem ->defaultLifetime ;
43+ $ item ->expiry = $ protoItem ->expiry ;
44+ $ item ->innerItem = $ protoItem ->innerItem ;
45+ $ item ->poolHash = $ protoItem ->poolHash ;
4746
4847 return $ item ;
4948 },
@@ -62,6 +61,20 @@ function ($deferred) {
6261 null ,
6362 CacheItem::class
6463 );
64+ $ this ->invalidateTags = \Closure::bind (
65+ function (AdapterInterface $ tagsAdapter , array $ tags ) {
66+ foreach ($ tagsAdapter ->getItems ($ tags ) as $ v ) {
67+ $ v ->set (1 + (int ) $ v ->get ());
68+ $ v ->defaultLifetime = 0 ;
69+ $ v ->expiry = null ;
70+ $ tagsAdapter ->saveDeferred ($ v );
71+ }
72+
73+ return $ tagsAdapter ->commit ();
74+ },
75+ null ,
76+ CacheItem::class
77+ );
6578 }
6679
6780 /**
@@ -74,13 +87,9 @@ public function invalidateTags(array $tags)
7487 $ tags [$ k ] = $ tag .static ::TAGS_PREFIX ;
7588 }
7689 }
90+ $ f = $ this ->invalidateTags ;
7791
78- foreach ($ this ->tagsAdapter ->getItems ($ tags ) as $ v ) {
79- $ v ->set (1 + (int ) $ v ->get ());
80- $ this ->tagsAdapter ->saveDeferred ($ v );
81- }
82-
83- return $ this ->tagsAdapter ->commit ();
92+ return $ f ($ this ->tagsAdapter , $ tags );
8493 }
8594
8695 /**
@@ -211,22 +220,23 @@ public function commit()
211220 $ ok = true ;
212221
213222 if ($ this ->deferred ) {
214- foreach ($ this ->deferred as $ key => $ item ) {
223+ $ items = $ this ->deferred ;
224+ foreach ($ items as $ key => $ item ) {
215225 if (!$ this ->itemsAdapter ->saveDeferred ($ item )) {
216226 unset($ this ->deferred [$ key ]);
217227 $ ok = false ;
218228 }
219229 }
220230
221231 $ f = $ this ->getTagsByKey ;
222- $ tagsByKey = $ f ($ this -> deferred );
232+ $ tagsByKey = $ f ($ items );
223233 $ deletedTags = $ this ->deferred = array ();
224234 $ tagVersions = $ this ->getTagVersions ($ tagsByKey );
225235 $ f = $ this ->createCacheItem ;
226236
227237 foreach ($ tagsByKey as $ key => $ tags ) {
228238 if ($ tags ) {
229- $ this ->itemsAdapter ->saveDeferred ($ f (static ::TAGS_PREFIX .$ key , array_intersect_key ($ tagVersions , $ tags )));
239+ $ this ->itemsAdapter ->saveDeferred ($ f (static ::TAGS_PREFIX .$ key , array_intersect_key ($ tagVersions , $ tags ), $ items [ $ key ] ));
230240 } else {
231241 $ deletedTags [] = static ::TAGS_PREFIX .$ key ;
232242 }
0 commit comments