MergeService.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\View\Asset;
  7. use Magento\Framework\App\Filesystem\DirectoryList;
  8. /**
  9. * Service model responsible for making a decision of whether to use the merged asset in place of original ones
  10. */
  11. class MergeService
  12. {
  13. /**
  14. * Object Manager
  15. *
  16. * @var \Magento\Framework\ObjectManagerInterface
  17. */
  18. protected $objectManager;
  19. /**
  20. * Config
  21. *
  22. * @var ConfigInterface
  23. */
  24. protected $config;
  25. /**
  26. * Filesystem
  27. *
  28. * @var \Magento\Framework\Filesystem
  29. */
  30. protected $filesystem;
  31. /**
  32. * State
  33. *
  34. * @var \Magento\Framework\App\State
  35. */
  36. protected $state;
  37. /**
  38. * Constructor
  39. *
  40. * @param \Magento\Framework\ObjectManagerInterface $objectManager
  41. * @param ConfigInterface $config
  42. * @param \Magento\Framework\Filesystem $filesystem
  43. * @param \Magento\Framework\App\State $state
  44. */
  45. public function __construct(
  46. \Magento\Framework\ObjectManagerInterface $objectManager,
  47. ConfigInterface $config,
  48. \Magento\Framework\Filesystem $filesystem,
  49. \Magento\Framework\App\State $state
  50. ) {
  51. $this->objectManager = $objectManager;
  52. $this->config = $config;
  53. $this->filesystem = $filesystem;
  54. $this->state = $state;
  55. }
  56. /**
  57. * Return merged assets, if merging is enabled for a given content type
  58. *
  59. * @param MergeableInterface[] $assets
  60. * @param string $contentType
  61. * @return array|\Iterator
  62. * @throws \InvalidArgumentException
  63. */
  64. public function getMergedAssets(array $assets, $contentType)
  65. {
  66. $isCss = $contentType == 'css';
  67. $isJs = $contentType == 'js';
  68. if (!$isCss && !$isJs) {
  69. throw new \InvalidArgumentException("Merge for content type '{$contentType}' is not supported.");
  70. }
  71. $isCssMergeEnabled = $this->config->isMergeCssFiles();
  72. $isJsMergeEnabled = $this->config->isMergeJsFiles();
  73. if (($isCss && $isCssMergeEnabled) || ($isJs && $isJsMergeEnabled)) {
  74. $mergeStrategyClass = \Magento\Framework\View\Asset\MergeStrategy\FileExists::class;
  75. if ($this->state->getMode() === \Magento\Framework\App\State::MODE_DEVELOPER) {
  76. $mergeStrategyClass = \Magento\Framework\View\Asset\MergeStrategy\Checksum::class;
  77. }
  78. $mergeStrategy = $this->objectManager->get($mergeStrategyClass);
  79. $assets = $this->objectManager->create(
  80. \Magento\Framework\View\Asset\Merged::class,
  81. ['assets' => $assets, 'mergeStrategy' => $mergeStrategy]
  82. );
  83. }
  84. return $assets;
  85. }
  86. /**
  87. * Remove all merged js/css files
  88. *
  89. * @return void
  90. */
  91. public function cleanMergedJsCss()
  92. {
  93. $this->filesystem->getDirectoryWrite(DirectoryList::STATIC_VIEW)
  94. ->delete(Merged::getRelativeDir());
  95. }
  96. }