ApiAwareResponseCache.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <?php
  2. namespace Webkul\BagistoApi\CacheProfiles;
  3. use Illuminate\Http\Request;
  4. use Spatie\ResponseCache\CacheProfiles\CacheProfile;
  5. use Symfony\Component\HttpFoundation\Response;
  6. /**
  7. * ApiAwareResponseCache Profile
  8. *
  9. * This cache profile:
  10. * 1. Excludes ALL API routes from caching (API should return fresh data)
  11. * 2. Caches shop/storefront pages for performance
  12. * 3. Only caches successful (200) responses
  13. * 4. Respects cache bypass headers
  14. *
  15. * Benefits:
  16. * - APIs always return fresh data with correct content-type
  17. * - Shop pages are cached for speed
  18. * - No HTML cached for API responses
  19. */
  20. class ApiAwareResponseCache implements CacheProfile
  21. {
  22. /**
  23. * Determine if the response cache middleware is enabled
  24. */
  25. public function enabled(Request $request): bool
  26. {
  27. return config('responsecache.enabled', false);
  28. }
  29. /**
  30. * Determine if the request should be cached.
  31. */
  32. public function shouldCacheRequest(Request $request): bool
  33. {
  34. // Don't cache API routes - they need fresh data
  35. if ($request->is('api/*') || $request->is('graphql*')) {
  36. return false;
  37. }
  38. // Don't cache non-GET requests
  39. if (! $request->isMethod('GET')) {
  40. return false;
  41. }
  42. // Don't cache requests with query parameters (search, filters, pagination)
  43. if ($request->getQueryString()) {
  44. return false;
  45. }
  46. // Don't cache if user is authenticated (personalized content)
  47. if ($request->user()) {
  48. return false;
  49. }
  50. // Cache only shop pages (storefront)
  51. if ($request->is('shop/*') ||
  52. $request->is('categories/*') ||
  53. $request->is('products/*') ||
  54. $request->is('*') && ! $request->is('admin/*')) {
  55. return true;
  56. }
  57. return false;
  58. }
  59. /**
  60. * Determine if the response should be cached.
  61. *
  62. * Only cache successful (200) HTML responses
  63. */
  64. public function shouldCacheResponse(Response $response): bool
  65. {
  66. // Only cache successful responses
  67. if ($response->getStatusCode() !== 200) {
  68. return false;
  69. }
  70. // Only cache HTML responses (not JSON or other formats)
  71. $contentType = $response->headers->get('Content-Type', '');
  72. if (strpos($contentType, 'text/html') === false) {
  73. return false;
  74. }
  75. return true;
  76. }
  77. /**
  78. * Return the tags to use for this cached response.
  79. */
  80. public function cacheNameSuffix(Request $request): string
  81. {
  82. return '';
  83. }
  84. /**
  85. * Return until when the response must be cached.
  86. */
  87. public function cacheRequestUntil(Request $request): \DateTime
  88. {
  89. return now()->addDay();
  90. }
  91. /**
  92. * Determine if cache name suffix should be used
  93. */
  94. public function useCacheNameSuffix(Request $request): string
  95. {
  96. return '';
  97. }
  98. }