* @copyright Copyright (c) 2022 Samuel Marshall / JCH Optimize * @license GNU/GPLv3, or later. See LICENSE file * * If LICENSE file missing, see . */ namespace JchOptimize\Core\Service\Provider; use _JchOptimizeVendor\V91\Joomla\DI\Container; use _JchOptimizeVendor\V91\Joomla\DI\ServiceProviderInterface; use _JchOptimizeVendor\V91\Joomla\Input\Input; use _JchOptimizeVendor\V91\Laminas\Cache\Pattern\CaptureCache as LaminasCaptureCache; use _JchOptimizeVendor\V91\Laminas\Cache\Storage\StorageInterface; use _JchOptimizeVendor\V91\Laminas\Cache\Storage\TaggableInterface; use _JchOptimizeVendor\V91\Psr\Log\LoggerInterface; use JchOptimize\Core\Cloudflare\CloudflareManager; use JchOptimize\Core\PageCache\CachedResponseEmitter; use JchOptimize\Core\PageCache\CaptureCache as CoreCaptureCache; use JchOptimize\Core\PageCache\CaptureCacheHtaccessManager; use JchOptimize\Core\PageCache\CaptureCachePolicy; use JchOptimize\Core\PageCache\CaptureCacheStore; use JchOptimize\Core\PageCache\CurrentPageResolver; use JchOptimize\Core\PageCache\PageCache as CorePageCache; use JchOptimize\Core\PageCache\PageCacheInvalidator; use JchOptimize\Core\PageCache\PageCacheItemQuery; use JchOptimize\Core\PageCache\PageCacheKeyFactory; use JchOptimize\Core\PageCache\PageCachePolicy; use JchOptimize\Core\PageCache\PageCacheRepository; use JchOptimize\Core\Platform\CacheInterface; use JchOptimize\Core\Platform\HooksInterface; use JchOptimize\Core\Platform\PathsInterface; use JchOptimize\Core\Platform\UtilityInterface; use JchOptimize\Core\Registry; use JchOptimize\Core\SystemUri\SystemUriResolverInterface; use ReflectionClass; use function defined; use const JCH_PRO; defined('_JCH_EXEC') or die('Restricted access'); class PageCache implements ServiceProviderInterface { public function register(Container $container): void { $container->share(CorePageCache::class, [$this, 'getPageCacheService']); $container->share(CoreCaptureCache::class, [$this, 'getCaptureCacheService']); $container->share(CurrentPageResolver::class, [$this, 'getCurrentPageResolverService']); $container->share(PageCacheKeyFactory::class, [$this, 'getPageCacheKeyFactoryService']); $container->set(PageCachePolicy::class, [$this, 'getPageCachePolicyService']); $container->share(PageCacheRepository::class, [$this, 'getPageCacheRepositoryService']); $container->set(PageCacheItemQuery::class, [$this, 'getPageCacheItemQueryService']); $container->share(CachedResponseEmitter::class, [$this, 'getCachedResponseEmitterService']); $container->set(PageCacheInvalidator::class, [$this, 'getPageCacheInvalidatorService']); $container->set(CaptureCachePolicy::class, [$this, 'getCaptureCachePolicyService']); $container->share(CaptureCacheStore::class, [$this, 'getCaptureCacheStoreService']); $container->set(CaptureCacheHtaccessManager::class, [$this, 'getCaptureCacheHtaccessManagerService']); } /** * @psalm-suppress InvalidArgument */ public function getPageCacheService(Container $container): CorePageCache { if (JCH_PRO) { return $container->get(CoreCaptureCache::class); } $pageCache = (new CorePageCache( $container->get(Input::class), $container->get(UtilityInterface::class), $this->getPageCacheAdapterName($container), $container->get(CurrentPageResolver::class), $container->get(PageCacheKeyFactory::class), $container->get(PageCachePolicy::class), $container->get(PageCacheRepository::class), $container->get(PageCacheItemQuery::class), $container->get(CachedResponseEmitter::class), $container->get(PageCacheInvalidator::class) )); return $pageCache; } /** * @psalm-suppress InvalidArgument */ public function getCaptureCacheService(Container $container): CoreCaptureCache { $captureCache = (new CoreCaptureCache( $container->get(Input::class), $container->get(UtilityInterface::class), $this->getPageCacheAdapterName($container), $container->get(CurrentPageResolver::class), $container->get(PageCacheKeyFactory::class), $container->get(PageCachePolicy::class), $container->get(PageCacheRepository::class), $container->get(PageCacheItemQuery::class), $container->get(CachedResponseEmitter::class), $container->get(PageCacheInvalidator::class), $container->get(CaptureCacheStore::class), $container->get(CaptureCachePolicy::class), $container->get(CaptureCacheHtaccessManager::class) )); return $captureCache; } public function getCurrentPageResolverService(Container $container): CurrentPageResolver { return new CurrentPageResolver( $container->get(Registry::class), $container->get(SystemUriResolverInterface::class) ); } public function getPageCacheKeyFactoryService(Container $container): PageCacheKeyFactory { return new PageCacheKeyFactory( $container->get(Registry::class), $container->get(HooksInterface::class), $container->get(UtilityInterface::class), $this->getPageCacheAdapterName($container) ); } public function getPageCachePolicyService(Container $container): PageCachePolicy { return new PageCachePolicy( $container->get(Registry::class), $container->get(Input::class), $container->get('page_cache'), $container->get(CacheInterface::class), $container->get(HooksInterface::class), $container->get(UtilityInterface::class), $container->get(CurrentPageResolver::class) ); } public function getPageCacheRepositoryService(Container $container): PageCacheRepository { return new PageCacheRepository( $container->get('page_cache'), $container->get(TaggableInterface::class), $this->getPageCacheAdapterName($container), fn(string $adapter): StorageInterface => $container->get($adapter) ); } public function getPageCacheItemQueryService(Container $container): PageCacheItemQuery { return new PageCacheItemQuery($container->get(PageCacheRepository::class)); } public function getCachedResponseEmitterService(Container $container): CachedResponseEmitter { return new CachedResponseEmitter($container->get(CacheInterface::class)); } public function getPageCacheInvalidatorService(Container $container): PageCacheInvalidator { return new PageCacheInvalidator( $container->get(PageCacheRepository::class), null, $container->get(CloudflareManager::class) ); } public function getCaptureCachePolicyService(Container $container): CaptureCachePolicy { return new CaptureCachePolicy( $container->get(Registry::class), $container->get(Input::class), $container->get(CacheInterface::class), $container->get(UtilityInterface::class), $container->get(CurrentPageResolver::class) ); } public function getCaptureCacheStoreService(Container $container): CaptureCacheStore { $store = new CaptureCacheStore( $container->get(LaminasCaptureCache::class), $container->get(PathsInterface::class), $container->get(CurrentPageResolver::class), $container->get(Registry::class), $container->get(UtilityInterface::class) ); $store->setLogger($container->get(LoggerInterface::class)); return $store; } public function getCaptureCacheHtaccessManagerService(Container $container): CaptureCacheHtaccessManager { return new CaptureCacheHtaccessManager( $container->get(Registry::class), $container->get(CacheInterface::class), $container->get(PathsInterface::class), $container->get(CaptureCachePolicy::class), $container->get(UtilityInterface::class) ); } private function getPageCacheAdapterName(Container $container): string { $reflection = new ReflectionClass($container->get('page_cache')); return $reflection->getShortName(); } }