diff --git a/src/Asset/AssetDumper.php b/src/Asset/AssetDumper.php index 888bcc9dcd560ece57a10dcf53978dfb7d80a9af..9cda4d52753c31f83f01a03d18d9a0ccd7637138 100644 --- a/src/Asset/AssetDumper.php +++ b/src/Asset/AssetDumper.php @@ -4,6 +4,7 @@ namespace Drupal\flysystem\Asset; use Drupal\Component\Utility\Crypt; use Drupal\Core\Asset\AssetDumper as DrupalAssetDumper; +use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\File\FileExists; @@ -16,6 +17,24 @@ class AssetDumper extends DrupalAssetDumper { use SchemeExtensionTrait; + /** + * Drupal Config factory service. + * + * @var \Drupal\Core\Config\ConfigFactoryInterface + */ + protected $configFactory; + /** + * AssetDumper constructor. + * + * @param \Drupal\Core\File\FileSystemInterface $file_system + * The file handler. + * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory + * Drupal Config factory service. + */ + public function __construct(FileSystemInterface $file_system, ConfigFactoryInterface $config_factory) { + $this->fileSystem = $file_system; + $this->configFactory = $config_factory; + } /** * {@inheritdoc} */ @@ -39,7 +58,7 @@ class AssetDumper extends DrupalAssetDumper { // file) in generating the file anyway. Sites on servers where rewrite rules // aren't working can set css.gzip to FALSE in order to skip // generating a file that won't be used. - if (extension_loaded('zlib') && \Drupal::config('system.performance')->get($file_extension . '.gzip')) { + if (extension_loaded('zlib') && $this->configFactory->get('system.performance')->get($file_extension . '.gzip')) { if (!file_exists($uri . '.gz') && !$this->fileSystem->saveData(gzencode($data, 9, FORCE_GZIP), $uri . '.gz', FileExists::Replace)) { return FALSE; } diff --git a/src/Asset/CssCollectionOptimizer.php b/src/Asset/CssCollectionOptimizer.php index 4ab167933a9a79550de6ac3772660c14a048650e..9fee802a8f4c62fecdbd4d62048a0854bb9d6720 100644 --- a/src/Asset/CssCollectionOptimizer.php +++ b/src/Asset/CssCollectionOptimizer.php @@ -7,6 +7,8 @@ use Drupal\Core\Logger\LoggerChannelTrait; /** * Optimizes CSS assets. + * + * @phpstan-ignore class.extendsDeprecatedClass */ class CssCollectionOptimizer extends DrupalCssCollectionOptimizer { @@ -22,12 +24,15 @@ class CssCollectionOptimizer extends DrupalCssCollectionOptimizer { $file_system = $this->fileSystem; $delete_stale = static function ($uri) use ($file_system) { // Default stale file threshold is 30 days (2592000 seconds). + // @phpstan-ignore-next-line $stale_file_threshold = \Drupal::config('system.performance')->get('stale_file_threshold') ?? 2592000; + // @phpstan-ignore-next-line if (\Drupal::time()->getRequestTime() - filemtime($uri) > $stale_file_threshold) { try { $file_system->delete($uri); } catch (\Exception $e) { + // @phpstan-ignore-next-line \Drupal::service('logger.factory')->get('flysystem')->error($e->getMessage()); } } diff --git a/src/Asset/CssCollectionOptimizerLazy.php b/src/Asset/CssCollectionOptimizerLazy.php index 2e1bfffcb465f29911e91f34e0d5e19032beb597..58643000a154d185d321f5fb1e1e03e9949c62d1 100644 --- a/src/Asset/CssCollectionOptimizerLazy.php +++ b/src/Asset/CssCollectionOptimizerLazy.php @@ -4,6 +4,8 @@ namespace Drupal\flysystem\Asset; use Drupal\Core\Asset\CssCollectionOptimizerLazy as DrupalCssCollectionOptimizerLazy; use Drupal\Core\File\Exception\FileException; +use Drupal\Core\Logger\LoggerChannelFactoryInterface; + /** * Optimizes CSS assets. @@ -12,6 +14,44 @@ class CssCollectionOptimizerLazy extends DrupalCssCollectionOptimizerLazy { use SchemeExtensionTrait; + /** + * Constructs a CssCollectionOptimizerLazy. + * + * @param \Drupal\Core\Asset\AssetCollectionGrouperInterface $grouper + * The grouper for CSS assets. + * @param \Drupal\Core\Asset\AssetOptimizerInterface $optimizer + * The asset optimizer. + * @param \Drupal\Core\Theme\ThemeManagerInterface $themeManager + * The theme manager. + * @param \Drupal\Core\Asset\LibraryDependencyResolverInterface $dependencyResolver + * The library dependency resolver. + * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack + * The request stack. + * @param \Drupal\Core\File\FileSystemInterface $fileSystem + * The file system service. + * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory + * The config factory. + * @param \Drupal\Core\File\FileUrlGeneratorInterface $fileUrlGenerator + * The file URL generator. + * @param \Drupal\Component\Datetime\TimeInterface $time + * The time service. + * @param \Drupal\Core\Language\LanguageManagerInterface $languageManager + * The language manager. + */ + public function __construct( + protected readonly AssetCollectionGrouperInterface $grouper, + protected readonly AssetOptimizerInterface $optimizer, + protected readonly ThemeManagerInterface $themeManager, + protected readonly LibraryDependencyResolverInterface $dependencyResolver, + protected readonly RequestStack $requestStack, + protected readonly FileSystemInterface $fileSystem, + protected readonly ConfigFactoryInterface $configFactory, + protected readonly FileUrlGeneratorInterface $fileUrlGenerator, + protected readonly TimeInterface $time, + protected readonly LanguageManagerInterface $languageManager, + protected readonly LoggerChannelFactoryInterface $loggerFactory, + ) {} + /** * {@inheritdoc} */ @@ -20,7 +60,7 @@ class CssCollectionOptimizerLazy extends DrupalCssCollectionOptimizerLazy { $this->fileSystem->deleteRecursive($this->getSchemeForExtension('css') . '://css'); } catch (FileException $fileException) { - \Drupal::logger('flysystem')->error($fileException->getMessage()); + $this->loggerFactory->get('flysystem')->error($fileException->getMessage()); } } diff --git a/src/Asset/JsCollectionOptimizer.php b/src/Asset/JsCollectionOptimizer.php index ca612541c0ee4a936477506a36032904862b5ddf..82d94b9f84a8b277ca5c165981968dc787cc713c 100644 --- a/src/Asset/JsCollectionOptimizer.php +++ b/src/Asset/JsCollectionOptimizer.php @@ -7,6 +7,8 @@ use Drupal\Core\Logger\LoggerChannelTrait; /** * Optimizes JavaScript assets. + * + * @phpstan-ignore class.extendsDeprecatedClass */ class JsCollectionOptimizer extends DrupalJsCollectionOptimizer { @@ -22,12 +24,18 @@ class JsCollectionOptimizer extends DrupalJsCollectionOptimizer { $file_system = $this->fileSystem; $delete_stale = static function ($uri) use ($file_system) { // Default stale file threshold is 30 days (2592000 seconds). + // @phpstan-ignore-next-line $stale_file_threshold = \Drupal::config('system.performance')->get('stale_file_threshold') ?? 2592000; + // @phpstan-ignore-next-line if (\Drupal::time()->getRequestTime() - filemtime($uri) > $stale_file_threshold) { try { $file_system->delete($uri); } + catch (\Exception $fileException) { + $this->loggerFactory->get('flysystem')->error($fileException->getMessage()); + } catch (\Exception $e) { + // @phpstan-ignore-next-line \Drupal::service('logger.factory')->get('flysystem')->error($e->getMessage()); } } diff --git a/src/Asset/JsCollectionOptimizerLazy.php b/src/Asset/JsCollectionOptimizerLazy.php index 385e6269f51dd586683ce27fc3663e9364dfe7ef..b53dd8174c77f46288bd161b0f85d28cadbc88b1 100644 --- a/src/Asset/JsCollectionOptimizerLazy.php +++ b/src/Asset/JsCollectionOptimizerLazy.php @@ -4,6 +4,7 @@ namespace Drupal\flysystem\Asset; use Drupal\Core\Asset\JsCollectionOptimizerLazy as DrupalJsCollectionOptimizerLazy; use Drupal\Core\File\Exception\FileException; +use Drupal\Core\Logger\LoggerChannelFactoryInterface; /** * Optimizes JavaScript assets. @@ -12,6 +13,44 @@ class JsCollectionOptimizerLazy extends DrupalJsCollectionOptimizerLazy { use SchemeExtensionTrait; + /** + * Constructs a JsCollectionOptimizerLazy. + * + * @param \Drupal\Core\Asset\AssetCollectionGrouperInterface $grouper + * The grouper for JS assets. + * @param \Drupal\Core\Asset\AssetOptimizerInterface $optimizer + * The asset optimizer. + * @param \Drupal\Core\Theme\ThemeManagerInterface $themeManager + * The theme manager. + * @param \Drupal\Core\Asset\LibraryDependencyResolverInterface $dependencyResolver + * The library dependency resolver. + * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack + * The request stack. + * @param \Drupal\Core\File\FileSystemInterface $fileSystem + * The file system service. + * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory + * The config factory. + * @param \Drupal\Core\File\FileUrlGeneratorInterface $fileUrlGenerator + * The file URL generator. + * @param \Drupal\Component\Datetime\TimeInterface $time + * The time service. + * @param \Drupal\Core\Language\LanguageManagerInterface $languageManager + * The language manager. + */ + public function __construct( + protected readonly AssetCollectionGrouperInterface $grouper, + protected readonly AssetOptimizerInterface $optimizer, + protected readonly ThemeManagerInterface $themeManager, + protected readonly LibraryDependencyResolverInterface $dependencyResolver, + protected readonly RequestStack $requestStack, + protected readonly FileSystemInterface $fileSystem, + protected readonly ConfigFactoryInterface $configFactory, + protected readonly FileUrlGeneratorInterface $fileUrlGenerator, + protected readonly TimeInterface $time, + protected readonly LanguageManagerInterface $languageManager, + protected readonly LoggerChannelFactoryInterface $loggerFactory, + ) {} + /** * {@inheritdoc} */ @@ -20,7 +59,7 @@ class JsCollectionOptimizerLazy extends DrupalJsCollectionOptimizerLazy { $this->fileSystem->deleteRecursive($this->getSchemeForExtension('js') . '://js'); } catch (FileException $fileException) { - \Drupal::logger('flysystem')->error($fileException->getMessage()); + $this->loggerFactory->get('flysystem')->error($fileException->getMessage()); } } diff --git a/tests/src/Unit/FlysystemServiceProviderTest.php b/tests/src/Unit/FlysystemServiceProviderTest.php index 02a16a00618493dcab1a1252161450305a631ded..8772044c2907c0cdb39d8f01c8b98fc57055b9c2 100644 --- a/tests/src/Unit/FlysystemServiceProviderTest.php +++ b/tests/src/Unit/FlysystemServiceProviderTest.php @@ -97,9 +97,11 @@ class FlysystemServiceProviderTest extends UnitTestCase { (new FlysystemServiceProvider())->register($this->container); $this->assertSame(AssetDumper::class, $this->container->getDefinition('asset.js.dumper')->getClass()); + // @phpstan-ignore classConstant.deprecatedClass $this->container->register('asset.js.collection_optimizer', JsCollectionOptimizer::class); (new FlysystemServiceProvider())->register($this->container); $this->assertSame(AssetDumper::class, $this->container->getDefinition('asset.js.dumper')->getClass()); + // @phpstan-ignore classConstant.deprecatedClass $this->assertSame(JsCollectionOptimizer::class, $this->container->getDefinition('asset.js.collection_optimizer')->getClass()); // A successful swap. @@ -122,6 +124,7 @@ class FlysystemServiceProviderTest extends UnitTestCase { public function testSwappingCssServices() { // Test swapping the asset dumper. $this->container->register('asset.css.dumper', AssetDumper::class); + // @phpstan-ignore classConstant.deprecatedClass $this->container->register('asset.css.collection_optimizer', CssCollectionOptimizer::class); $this->container->register('asset.css.optimizer', CssOptimizer::class);