1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Framework\View\Asset\PreProcessor;
use Magento\Framework\ObjectManagerInterface;
use Magento\Framework\View\Asset\PreProcessorInterface;
/**
* A registry of asset preprocessors (not to confuse with the "Registry" pattern)
*/
class Pool
{
/**
* Name of property referenced to pre-processor implementation class
*/
const PREPROCESSOR_CLASS = 'class';
/**
* @var array
*/
private $preprocessors;
/**
* @var array
*/
private $instances;
/**
* @var Helper\SortInterface
*/
private $sorter;
/**
* @var string
*/
private $defaultPreprocessor;
/**
* @var ObjectManagerInterface
*/
private $objectManager;
/**
* Constructor
*
* @param ObjectManagerInterface $objectManager
* @param Helper\SortInterface $sorter
* @param string $defaultPreprocessor
* @param array $preprocessors
*/
public function __construct(
ObjectManagerInterface $objectManager,
Helper\SortInterface $sorter,
$defaultPreprocessor,
array $preprocessors = []
) {
$this->preprocessors = $preprocessors;
$this->sorter = $sorter;
$this->defaultPreprocessor = $defaultPreprocessor;
$this->objectManager = $objectManager;
}
/**
* Execute preprocessors instances suitable to convert source content type into a destination one
*
* @param Chain $chain
* @return void
*/
public function process(Chain $chain)
{
$type = $chain->getTargetContentType();
foreach ($this->getPreProcessors($type) as $preProcessor) {
$preProcessor->process($chain);
}
}
/**
* Retrieve preProcessors by types
*
* @param string $type
* @return PreProcessorInterface[]
* @throws \UnexpectedValueException
*/
private function getPreProcessors($type)
{
if (isset($this->instances[$type])) {
return $this->instances[$type];
}
if (isset($this->preprocessors[$type])) {
$preprocessors = $this->sorter->sort($this->preprocessors[$type]);
} else {
$preprocessors = [
'default' => [self::PREPROCESSOR_CLASS => $this->defaultPreprocessor]
];
}
$this->instances[$type] = [];
foreach ($preprocessors as $preprocessor) {
$instance = $this->objectManager->get($preprocessor[self::PREPROCESSOR_CLASS]);
if (!$instance instanceof PreProcessorInterface) {
throw new \UnexpectedValueException(
'"' . $preprocessor[self::PREPROCESSOR_CLASS] . '" has to implement the PreProcessorInterface.'
);
}
$this->instances[$type][] = $instance;
}
return $this->instances[$type];
}
}