1111
1212namespace FOS \HttpCacheBundle \EventListener ;
1313
14+ use FOS \HttpCache \ResponseTagger ;
1415use FOS \HttpCache \UserContext \HashGenerator ;
16+ use FOS \HttpCacheBundle \UserContextInvalidator ;
1517use Symfony \Component \EventDispatcher \EventSubscriberInterface ;
1618use Symfony \Component \HttpFoundation \Request ;
1719use Symfony \Component \HttpFoundation \RequestMatcherInterface ;
@@ -45,6 +47,13 @@ class UserContextListener implements EventSubscriberInterface
4547 */
4648 private $ hashGenerator ;
4749
50+ /**
51+ * If the response tagger is set, the hash lookup response is tagged with the session id for later invalidation.
52+ *
53+ * @var ResponseTagger|null
54+ */
55+ private $ responseTagger ;
56+
4857 /**
4958 * @var array
5059 */
@@ -60,26 +69,20 @@ class UserContextListener implements EventSubscriberInterface
6069 * It prevents issues when the hash generator that is used returns a customized value for anonymous users,
6170 * that differs from the documented, hardcoded one.
6271 *
63- * @var RequestMatcherInterface
72+ * @var RequestMatcherInterface|null
6473 */
6574 private $ anonymousRequestMatcher ;
6675
67- /**
68- * Constructor.
69- *
70- * @param RequestMatcherInterface $requestMatcher
71- * @param HashGenerator $hashGenerator
72- * @param RequestMatcherInterface|null $anonymousRequestMatcher
73- * @param array $options
74- */
7576 public function __construct (
7677 RequestMatcherInterface $ requestMatcher ,
7778 HashGenerator $ hashGenerator ,
7879 RequestMatcherInterface $ anonymousRequestMatcher = null ,
80+ ResponseTagger $ responseTagger = null ,
7981 array $ options = []
8082 ) {
8183 $ this ->requestMatcher = $ requestMatcher ;
8284 $ this ->hashGenerator = $ hashGenerator ;
85+ $ this ->responseTagger = $ responseTagger ;
8386 $ this ->anonymousRequestMatcher = $ anonymousRequestMatcher ;
8487
8588 $ resolver = new OptionsResolver ();
@@ -115,7 +118,8 @@ public function onKernelRequest(GetResponseEvent $event)
115118 return ;
116119 }
117120
118- if (!$ this ->requestMatcher ->matches ($ event ->getRequest ())) {
121+ $ request = $ event ->getRequest ();
122+ if (!$ this ->requestMatcher ->matches ($ request )) {
119123 if ($ event ->getRequest ()->headers ->has ($ this ->options ['user_hash_header ' ])
120124 && !$ this ->isAnonymous ($ event ->getRequest ())
121125 ) {
@@ -127,6 +131,11 @@ public function onKernelRequest(GetResponseEvent $event)
127131
128132 $ hash = $ this ->hashGenerator ->generateHash ();
129133
134+ if ($ this ->responseTagger && $ request ->hasSession ()) {
135+ $ tag = UserContextInvalidator::buildTag ($ request ->getSession ()->getId ());
136+ $ this ->responseTagger ->addTags ([$ tag ]);
137+ }
138+
130139 // status needs to be 200 as otherwise varnish will not cache the response.
131140 $ response = new Response ('' , 200 , [
132141 $ this ->options ['user_hash_header ' ] => $ hash ,
0 commit comments