1 | <?php |
||
25 | class Loader implements LoaderInterface |
||
26 | { |
||
27 | /** |
||
28 | * @var FixturesLoaderInterface |
||
29 | */ |
||
30 | private $fixturesLoader; |
||
31 | |||
32 | /** |
||
33 | * @var ProcessorChain |
||
34 | */ |
||
35 | private $processorChain; |
||
36 | |||
37 | /** |
||
38 | * @var bool |
||
39 | */ |
||
40 | private $persistOnce; |
||
41 | |||
42 | /** |
||
43 | * @var int |
||
44 | */ |
||
45 | private $loadingLimit; |
||
46 | |||
47 | /** |
||
48 | * @var string[] |
||
49 | */ |
||
50 | private $errorMessages; |
||
51 | |||
52 | /** |
||
53 | * @param FixturesLoaderInterface $fixturesLoader |
||
54 | * @param ProcessorChain $processorChain |
||
55 | * @param bool $persistOnce |
||
56 | * @param int $loadingLimit |
||
57 | */ |
||
58 | 150 | public function __construct( |
|
59 | FixturesLoaderInterface $fixturesLoader, |
||
60 | ProcessorChain $processorChain, |
||
61 | $persistOnce, |
||
62 | $loadingLimit |
||
63 | ) { |
||
64 | 150 | $this->fixturesLoader = $fixturesLoader; |
|
65 | 150 | $this->processorChain = $processorChain; |
|
66 | 150 | $this->persistOnce = $persistOnce; |
|
67 | 150 | $this->loadingLimit = $loadingLimit; |
|
68 | 150 | } |
|
69 | |||
70 | /** |
||
71 | * {@inheritdoc} |
||
72 | */ |
||
73 | 105 | public function load(PersisterInterface $persister, array $fixturesFiles) |
|
74 | { |
||
75 | 105 | if ($this->fixturesLoader instanceof FixturesLoader) { |
|
76 | 93 | $_persister = $this->fixturesLoader->getPersister(); |
|
77 | 93 | $this->fixturesLoader->setPersister($persister); |
|
78 | 93 | } |
|
79 | |||
80 | 105 | if (0 === count($fixturesFiles)) { |
|
81 | 3 | return []; |
|
82 | } |
||
83 | |||
84 | 102 | $objects = []; |
|
85 | 102 | $loadFileAttempts = 0; |
|
86 | 102 | $normalizedFixturesFiles = $this->normalizeFixturesFiles($fixturesFiles); |
|
87 | |||
88 | 102 | $this->errorMessages = []; |
|
89 | 102 | while (true) { |
|
90 | 102 | $objects = array_merge($objects, $this->tryToLoadFiles($persister, $normalizedFixturesFiles, $objects)); |
|
91 | |||
92 | 102 | if (true === $this->areAllFixturesLoaded($normalizedFixturesFiles)) { |
|
93 | 96 | break; |
|
94 | } |
||
95 | |||
96 | 66 | if ($this->loadingLimit <= $loadFileAttempts) { |
|
97 | 6 | throw new LoadingLimitException($this->loadingLimit, $normalizedFixturesFiles, $this->errorMessages); |
|
98 | } |
||
99 | |||
100 | 66 | ++$loadFileAttempts; |
|
101 | 66 | } |
|
102 | |||
103 | 96 | if (true === $this->persistOnce) { |
|
104 | 6 | $this->persist($persister, $objects); |
|
105 | 6 | } |
|
106 | |||
107 | 96 | if (isset($_persister)) { |
|
108 | 12 | $this->fixturesLoader->setPersister($_persister); |
|
109 | 12 | } |
|
110 | |||
111 | 96 | return $objects; |
|
112 | } |
||
113 | |||
114 | /** |
||
115 | * @return ProcessorChain |
||
116 | */ |
||
117 | 99 | public function getProcessorChain() |
|
121 | |||
122 | /** |
||
123 | * {@inheritdoc} |
||
124 | */ |
||
125 | 99 | public function getProcessors() |
|
129 | |||
130 | /** |
||
131 | * {@inheritdoc} |
||
132 | */ |
||
133 | 84 | public function getPersistOnce() |
|
137 | |||
138 | /** |
||
139 | * {@inheritdoc} |
||
140 | */ |
||
141 | 78 | public function getLoadingLimit() |
|
145 | |||
146 | 102 | private function areAllFixturesLoaded(array $normalizedFixturesFiles) |
|
147 | { |
||
156 | |||
157 | /** |
||
158 | * Returns an array where the key is the fixture file path and the value is the boolean false value. |
||
159 | * |
||
160 | * @param string[] $fixturesFiles |
||
161 | * |
||
162 | * @return array |
||
163 | */ |
||
164 | 102 | private function normalizeFixturesFiles(array $fixturesFiles) |
|
173 | |||
174 | /** |
||
175 | * Goes through all fixtures files to try to load them one by one and specify for each if the file could |
||
176 | * successfuly be loaded or not. |
||
177 | * |
||
178 | * @param PersisterInterface $persister |
||
179 | * @param array $normalizedFixturesFiles Array with the file real path as key and true as a value if |
||
180 | * the files has been loaded. |
||
181 | * @param array $references |
||
182 | * |
||
183 | * @return \object[] All objects that could have been loaded. |
||
184 | */ |
||
185 | 102 | private function tryToLoadFiles(PersisterInterface $persister, array &$normalizedFixturesFiles, array $references) |
|
209 | |||
210 | /** |
||
211 | * Uses the Fixture persister to persist objects and calling the processors. |
||
212 | * |
||
213 | * @param PersisterInterface $persister |
||
214 | * @param object[] $objects |
||
215 | */ |
||
216 | 96 | private function persist(PersisterInterface $persister, array $objects) |
|
232 | |||
233 | /** |
||
234 | * Registers the error message with the related fixture file. |
||
235 | * |
||
236 | * @param string $fixtureFilePath |
||
237 | * @param string $errorMessage |
||
238 | */ |
||
239 | 66 | private function registerErrorMessage($fixtureFilePath, $errorMessage) |
|
251 | } |
||
252 |