11
11
12
12
namespace FOS \HttpCache \SymfonyCache ;
13
13
14
+ use FOS \HttpCache \TagHeaderFormatter \CommaSeparatedTagHeaderFormatter ;
15
+ use FOS \HttpCache \TagHeaderFormatter \TagHeaderParser ;
14
16
use Symfony \Component \HttpFoundation \Response ;
15
17
use Symfony \Component \OptionsResolver \OptionsResolver ;
16
18
use Toflar \Psr6HttpCacheStore \Psr6StoreInterface ;
@@ -42,6 +44,11 @@ class PurgeTagsListener extends AccessControlledListener
42
44
*/
43
45
private $ tagsHeader ;
44
46
47
+ /**
48
+ * @var TagHeaderParser
49
+ */
50
+ private $ tagsParser ;
51
+
45
52
/**
46
53
* When creating the purge listener, you can configure an additional option.
47
54
*
@@ -65,6 +72,7 @@ public function __construct(array $options = [])
65
72
66
73
$ this ->tagsMethod = $ options ['tags_method ' ];
67
74
$ this ->tagsHeader = $ options ['tags_header ' ];
75
+ $ this ->tagsParser = $ options ['tags_parser ' ];
68
76
}
69
77
70
78
/**
@@ -125,11 +133,7 @@ public function handlePurgeTags(CacheEvent $event)
125
133
$ headers = $ request ->headers ->get ($ this ->tagsHeader , '' , false );
126
134
}
127
135
128
- foreach ($ headers as $ header ) {
129
- foreach (explode (', ' , $ header ) as $ tag ) {
130
- $ tags [] = $ tag ;
131
- }
132
- }
136
+ $ tags = $ this ->tagsParser ->parseTagsHeaderValue ($ headers );
133
137
134
138
if ($ store ->invalidateTags ($ tags )) {
135
139
$ response ->setStatusCode (200 , 'Purged ' );
@@ -151,9 +155,11 @@ protected function getOptionsResolver()
151
155
$ resolver ->setDefaults ([
152
156
'tags_method ' => static ::DEFAULT_TAGS_METHOD ,
153
157
'tags_header ' => static ::DEFAULT_TAGS_HEADER ,
158
+ 'tags_parser ' => new CommaSeparatedTagHeaderFormatter (),
154
159
]);
155
160
$ resolver ->setAllowedTypes ('tags_method ' , 'string ' );
156
161
$ resolver ->setAllowedTypes ('tags_header ' , 'string ' );
162
+ $ resolver ->setAllowedTypes ('tags_parser ' , TagHeaderParser::class);
157
163
158
164
return $ resolver ;
159
165
}
0 commit comments