77use Illuminate \Contracts \Container \Container ;
88use Symfony \Component \HttpFoundation \Request ;
99use Symfony \Component \HttpFoundation \Response ;
10+ use Symfony \Component \HttpFoundation \JsonResponse ;
1011
1112class Cache
1213{
@@ -150,7 +151,7 @@ public function shouldCache(Request $request, Response $response)
150151 */
151152 public function cache (Request $ request , Response $ response )
152153 {
153- list ($ path , $ file ) = $ this ->getDirectoryAndFileNames ($ request );
154+ list ($ path , $ file ) = $ this ->getDirectoryAndFileNames ($ request, $ response );
154155
155156 $ this ->files ->makeDirectory ($ path , 0775 , true , true );
156157
@@ -169,7 +170,10 @@ public function cache(Request $request, Response $response)
169170 */
170171 public function forget ($ slug )
171172 {
172- return $ this ->files ->delete ($ this ->getCachePath ($ slug .'.html ' ));
173+ $ deletedHtml = $ this ->files ->delete ($ this ->getCachePath ($ slug .'.html ' ));
174+ $ deletedJson = $ this ->files ->delete ($ this ->getCachePath ($ slug .'.json ' ));
175+
176+ return $ deletedHtml || $ deletedJson ;
173177 }
174178
175179 /**
@@ -186,13 +190,17 @@ public function clear()
186190 * Get the names of the directory and file.
187191 *
188192 * @param \Illuminate\Http\Request $request
193+ * @param \Illuminate\Http\Response $response
189194 * @return array
190195 */
191- protected function getDirectoryAndFileNames ($ request )
196+ protected function getDirectoryAndFileNames ($ request, $ response )
192197 {
193198 $ segments = explode ('/ ' , ltrim ($ request ->getPathInfo (), '/ ' ));
194199
195- $ file = $ this ->aliasFilename (array_pop ($ segments )).'.html ' ;
200+ $ filename = $ this ->aliasFilename (array_pop ($ segments ));
201+ $ extension = $ this ->guessFileExtension ($ response );
202+
203+ $ file = "{$ filename }. {$ extension }" ;
196204
197205 return [$ this ->getCachePath (implode ('/ ' , $ segments )), $ file ];
198206 }
@@ -219,4 +227,21 @@ protected function getDefaultCachePath()
219227 return $ this ->container ->make ('path.public ' ).'/page-cache ' ;
220228 }
221229 }
230+
231+ /**
232+ * Guess the correct file extension for the given response.
233+ *
234+ * Currently, only JSON and HTML are supported.
235+ *
236+ * @return string
237+ */
238+ protected function guessFileExtension ($ response )
239+ {
240+ if ($ response instanceof JsonResponse) {
241+ return 'json ' ;
242+ }
243+
244+ return 'html ' ;
245+ }
246+
222247}
0 commit comments