Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

YamlFileLoader.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 17.05 KiB


001  <?php
002   
003  /*
004   * This file is part of the Symfony package.
005   *
006   * (c) Fabien Potencier <fabien@symfony.com>
007   *
008   * For the full copyright and license information, please view the LICENSE
009   * file that was distributed with this source code.
010   */
011   
012  namespace Symfony\Component\DependencyInjection\Loader;
013   
014  use Symfony\Component\DependencyInjection\DefinitionDecorator;
015  use Symfony\Component\DependencyInjection\Alias;
016  use Symfony\Component\DependencyInjection\ContainerInterface;
017  use Symfony\Component\DependencyInjection\Definition;
018  use Symfony\Component\DependencyInjection\Reference;
019  use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
020  use Symfony\Component\DependencyInjection\Exception\RuntimeException;
021  use Symfony\Component\Config\Resource\FileResource;
022  use Symfony\Component\Yaml\Exception\ParseException;
023  use Symfony\Component\Yaml\Parser as YamlParser;
024  use Symfony\Component\ExpressionLanguage\Expression;
025   
026  /**
027   * YamlFileLoader loads YAML files service definitions.
028   *
029   * The YAML format does not support anonymous services (cf. the XML loader).
030   *
031   * @author Fabien Potencier <fabien@symfony.com>
032   */
033  class YamlFileLoader extends FileLoader
034  {
035      private $yamlParser;
036   
037      /**
038       * {@inheritdoc}
039       */
040      public function load($resource, $type = null)
041      {
042          $path = $this->locator->locate($resource);
043   
044          $content = $this->loadFile($path);
045   
046          $this->container->addResource(new FileResource($path));
047   
048          // empty file
049          if (null === $content) {
050              return;
051          }
052   
053          // imports
054          $this->parseImports($content, $path);
055   
056          // parameters
057          if (isset($content['parameters'])) {
058              if (!is_array($content['parameters'])) {
059                  throw new InvalidArgumentException(sprintf('The "parameters" key should contain an array in %s. Check your YAML syntax.', $resource));
060              }
061   
062              foreach ($content['parameters'] as $key => $value) {
063                  $this->container->setParameter($key, $this->resolveServices($value));
064              }
065          }
066   
067          // extensions
068          $this->loadFromExtensions($content);
069   
070          // services
071          $this->parseDefinitions($content, $resource);
072      }
073   
074      /**
075       * {@inheritdoc}
076       */
077      public function supports($resource, $type = null)
078      {
079          return is_string($resource) && in_array(pathinfo($resource, PATHINFO_EXTENSION), array('yml', 'yaml'), true);
080      }
081   
082      /**
083       * Parses all imports.
084       *
085       * @param array  $content
086       * @param string $file
087       */
088      private function parseImports($content, $file)
089      {
090          if (!isset($content['imports'])) {
091              return;
092          }
093   
094          if (!is_array($content['imports'])) {
095              throw new InvalidArgumentException(sprintf('The "imports" key should contain an array in %s. Check your YAML syntax.', $file));
096          }
097   
098          $defaultDirectory = dirname($file);
099          foreach ($content['imports'] as $import) {
100              if (!is_array($import)) {
101                  throw new InvalidArgumentException(sprintf('The values in the "imports" key should be arrays in %s. Check your YAML syntax.', $file));
102              }
103   
104              $this->setCurrentDir($defaultDirectory);
105              $this->import($import['resource'], null, isset($import['ignore_errors']) ? (bool) $import['ignore_errors'] : false, $file);
106          }
107      }
108   
109      /**
110       * Parses definitions.
111       *
112       * @param array  $content
113       * @param string $file
114       */
115      private function parseDefinitions($content, $file)
116      {
117          if (!isset($content['services'])) {
118              return;
119          }
120   
121          if (!is_array($content['services'])) {
122              throw new InvalidArgumentException(sprintf('The "services" key should contain an array in %s. Check your YAML syntax.', $file));
123          }
124   
125          foreach ($content['services'] as $id => $service) {
126              $this->parseDefinition($id, $service, $file);
127          }
128      }
129   
130      /**
131       * Parses a definition.
132       *
133       * @param string $id
134       * @param array  $service
135       * @param string $file
136       *
137       * @throws InvalidArgumentException When tags are invalid
138       */
139      private function parseDefinition($id, $service, $file)
140      {
141          if (is_string($service) && 0 === strpos($service, '@')) {
142              $this->container->setAlias($id, substr($service, 1));
143   
144              return;
145          }
146   
147          if (!is_array($service)) {
148              throw new InvalidArgumentException(sprintf('A service definition must be an array or a string starting with "@" but %s found for service "%s" in %s. Check your YAML syntax.', gettype($service), $id, $file));
149          }
150   
151          if (isset($service['alias'])) {
152              $public = !array_key_exists('public', $service) || (bool) $service['public'];
153              $this->container->setAlias($id, new Alias($service['alias'], $public));
154   
155              return;
156          }
157   
158          if (isset($service['parent'])) {
159              $definition = new DefinitionDecorator($service['parent']);
160          } else {
161              $definition = new Definition();
162          }
163   
164          if (isset($service['class'])) {
165              $definition->setClass($service['class']);
166          }
167   
168          if (isset($service['shared'])) {
169              $definition->setShared($service['shared']);
170          }
171   
172          if (isset($service['scope'])) {
173              if ('request' !== $id) {
174                  @trigger_error(sprintf('The "scope" key of service "%s" in file "%s" is deprecated since version 2.8 and will be removed in 3.0.', $id, $file), E_USER_DEPRECATED);
175              }
176              $definition->setScope($service['scope'], false);
177          }
178   
179          if (isset($service['synthetic'])) {
180              $definition->setSynthetic($service['synthetic']);
181          }
182   
183          if (isset($service['synchronized'])) {
184              @trigger_error(sprintf('The "synchronized" key of service "%s" in file "%s" is deprecated since version 2.7 and will be removed in 3.0.', $id, $file), E_USER_DEPRECATED);
185              $definition->setSynchronized($service['synchronized'], 'request' !== $id);
186          }
187   
188          if (isset($service['lazy'])) {
189              $definition->setLazy($service['lazy']);
190          }
191   
192          if (isset($service['public'])) {
193              $definition->setPublic($service['public']);
194          }
195   
196          if (isset($service['abstract'])) {
197              $definition->setAbstract($service['abstract']);
198          }
199   
200          if (array_key_exists('deprecated', $service)) {
201              $definition->setDeprecated(true, $service['deprecated']);
202          }
203   
204          if (isset($service['factory'])) {
205              if (is_string($service['factory'])) {
206                  if (strpos($service['factory'], ':') !== false && strpos($service['factory'], '::') === false) {
207                      $parts = explode(':', $service['factory']);
208                      $definition->setFactory(array($this->resolveServices('@'.$parts[0]), $parts[1]));
209                  } else {
210                      $definition->setFactory($service['factory']);
211                  }
212              } else {
213                  $definition->setFactory(array($this->resolveServices($service['factory'][0]), $service['factory'][1]));
214              }
215          }
216   
217          if (isset($service['factory_class'])) {
218              @trigger_error(sprintf('The "factory_class" key of service "%s" in file "%s" is deprecated since version 2.6 and will be removed in 3.0. Use "factory" instead.', $id, $file), E_USER_DEPRECATED);
219              $definition->setFactoryClass($service['factory_class']);
220          }
221   
222          if (isset($service['factory_method'])) {
223              @trigger_error(sprintf('The "factory_method" key of service "%s" in file "%s" is deprecated since version 2.6 and will be removed in 3.0. Use "factory" instead.', $id, $file), E_USER_DEPRECATED);
224              $definition->setFactoryMethod($service['factory_method']);
225          }
226   
227          if (isset($service['factory_service'])) {
228              @trigger_error(sprintf('The "factory_service" key of service "%s" in file "%s" is deprecated since version 2.6 and will be removed in 3.0. Use "factory" instead.', $id, $file), E_USER_DEPRECATED);
229              $definition->setFactoryService($service['factory_service']);
230          }
231   
232          if (isset($service['file'])) {
233              $definition->setFile($service['file']);
234          }
235   
236          if (isset($service['arguments'])) {
237              $definition->setArguments($this->resolveServices($service['arguments']));
238          }
239   
240          if (isset($service['properties'])) {
241              $definition->setProperties($this->resolveServices($service['properties']));
242          }
243   
244          if (isset($service['configurator'])) {
245              if (is_string($service['configurator'])) {
246                  $definition->setConfigurator($service['configurator']);
247              } else {
248                  $definition->setConfigurator(array($this->resolveServices($service['configurator'][0]), $service['configurator'][1]));
249              }
250          }
251   
252          if (isset($service['calls'])) {
253              if (!is_array($service['calls'])) {
254                  throw new InvalidArgumentException(sprintf('Parameter "calls" must be an array for service "%s" in %s. Check your YAML syntax.', $id, $file));
255              }
256   
257              foreach ($service['calls'] as $call) {
258                  if (isset($call['method'])) {
259                      $method = $call['method'];
260                      $args = isset($call['arguments']) ? $this->resolveServices($call['arguments']) : array();
261                  } else {
262                      $method = $call[0];
263                      $args = isset($call[1]) ? $this->resolveServices($call[1]) : array();
264                  }
265   
266                  $definition->addMethodCall($method, $args);
267              }
268          }
269   
270          if (isset($service['tags'])) {
271              if (!is_array($service['tags'])) {
272                  throw new InvalidArgumentException(sprintf('Parameter "tags" must be an array for service "%s" in %s. Check your YAML syntax.', $id, $file));
273              }
274   
275              foreach ($service['tags'] as $tag) {
276                  if (!is_array($tag)) {
277                      throw new InvalidArgumentException(sprintf('A "tags" entry must be an array for service "%s" in %s. Check your YAML syntax.', $id, $file));
278                  }
279   
280                  if (!isset($tag['name'])) {
281                      throw new InvalidArgumentException(sprintf('A "tags" entry is missing a "name" key for service "%s" in %s.', $id, $file));
282                  }
283   
284                  if (!is_string($tag['name']) || '' === $tag['name']) {
285                      throw new InvalidArgumentException(sprintf('The tag name for service "%s" in %s must be a non-empty string.', $id, $file));
286                  }
287   
288                  $name = $tag['name'];
289                  unset($tag['name']);
290   
291                  foreach ($tag as $attribute => $value) {
292                      if (!is_scalar($value) && null !== $value) {
293                          throw new InvalidArgumentException(sprintf('A "tags" attribute must be of a scalar-type for service "%s", tag "%s", attribute "%s" in %s. Check your YAML syntax.', $id, $name, $attribute, $file));
294                      }
295                  }
296   
297                  $definition->addTag($name, $tag);
298              }
299          }
300   
301          if (isset($service['decorates'])) {
302              if ('' !== $service['decorates'] && '@' === $service['decorates'][0]) {
303                  throw new InvalidArgumentException(sprintf('The value of the "decorates" option for the "%s" service must be the id of the service without the "@" prefix (replace "%s" with "%s").', $id, $service['decorates'], substr($service['decorates'], 1)));
304              }
305   
306              $renameId = isset($service['decoration_inner_name']) ? $service['decoration_inner_name'] : null;
307              $priority = isset($service['decoration_priority']) ? $service['decoration_priority'] : 0;
308              $definition->setDecoratedService($service['decorates'], $renameId, $priority);
309          }
310   
311          if (isset($service['autowire'])) {
312              $definition->setAutowired($service['autowire']);
313          }
314   
315          if (isset($service['autowiring_types'])) {
316              if (is_string($service['autowiring_types'])) {
317                  $definition->addAutowiringType($service['autowiring_types']);
318              } else {
319                  if (!is_array($service['autowiring_types'])) {
320                      throw new InvalidArgumentException(sprintf('Parameter "autowiring_types" must be a string or an array for service "%s" in %s. Check your YAML syntax.', $id, $file));
321                  }
322   
323                  foreach ($service['autowiring_types'] as $autowiringType) {
324                      if (!is_string($autowiringType)) {
325                          throw new InvalidArgumentException(sprintf('A "autowiring_types" attribute must be of type string for service "%s" in %s. Check your YAML syntax.', $id, $file));
326                      }
327   
328                      $definition->addAutowiringType($autowiringType);
329                  }
330              }
331          }
332   
333          $this->container->setDefinition($id, $definition);
334      }
335   
336      /**
337       * Loads a YAML file.
338       *
339       * @param string $file
340       *
341       * @return array The file content
342       *
343       * @throws InvalidArgumentException when the given file is not a local file or when it does not exist
344       */
345      protected function loadFile($file)
346      {
347          if (!class_exists('Symfony\Component\Yaml\Parser')) {
348              throw new RuntimeException('Unable to load YAML config files as the Symfony Yaml Component is not installed.');
349          }
350   
351          if (!stream_is_local($file)) {
352              throw new InvalidArgumentException(sprintf('This is not a local file "%s".', $file));
353          }
354   
355          if (!file_exists($file)) {
356              throw new InvalidArgumentException(sprintf('The service file "%s" is not valid.', $file));
357          }
358   
359          if (null === $this->yamlParser) {
360              $this->yamlParser = new YamlParser();
361          }
362   
363          try {
364              $configuration = $this->yamlParser->parse(file_get_contents($file));
365          } catch (ParseException $e) {
366              throw new InvalidArgumentException(sprintf('The file "%s" does not contain valid YAML.', $file), 0, $e);
367          }
368   
369          return $this->validate($configuration, $file);
370      }
371   
372      /**
373       * Validates a YAML file.
374       *
375       * @param mixed  $content
376       * @param string $file
377       *
378       * @return array
379       *
380       * @throws InvalidArgumentException When service file is not valid
381       */
382      private function validate($content, $file)
383      {
384          if (null === $content) {
385              return $content;
386          }
387   
388          if (!is_array($content)) {
389              throw new InvalidArgumentException(sprintf('The service file "%s" is not valid. It should contain an array. Check your YAML syntax.', $file));
390          }
391   
392          foreach ($content as $namespace => $data) {
393              if (in_array($namespace, array('imports', 'parameters', 'services'))) {
394                  continue;
395              }
396   
397              if (!$this->container->hasExtension($namespace)) {
398                  $extensionNamespaces = array_filter(array_map(function ($ext) { return $ext->getAlias(); }, $this->container->getExtensions()));
399                  throw new InvalidArgumentException(sprintf(
400                      'There is no extension able to load the configuration for "%s" (in %s). Looked for namespace "%s", found %s',
401                      $namespace,
402                      $file,
403                      $namespace,
404                      $extensionNamespaces ? sprintf('"%s"', implode('", "', $extensionNamespaces)) : 'none'
405                  ));
406              }
407          }
408   
409          return $content;
410      }
411   
412      /**
413       * Resolves services.
414       *
415       * @param string|array $value
416       *
417       * @return array|string|Reference
418       */
419      private function resolveServices($value)
420      {
421          if (is_array($value)) {
422              $value = array_map(array($this, 'resolveServices'), $value);
423          } elseif (is_string($value) && 0 === strpos($value, '@=')) {
424              return new Expression(substr($value, 2));
425          } elseif (is_string($value) && 0 === strpos($value, '@')) {
426              if (0 === strpos($value, '@@')) {
427                  $value = substr($value, 1);
428                  $invalidBehavior = null;
429              } elseif (0 === strpos($value, '@?')) {
430                  $value = substr($value, 2);
431                  $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
432              } else {
433                  $value = substr($value, 1);
434                  $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
435              }
436   
437              if ('=' === substr($value, -1)) {
438                  $value = substr($value, 0, -1);
439                  $strict = false;
440              } else {
441                  $strict = true;
442              }
443   
444              if (null !== $invalidBehavior) {
445                  $value = new Reference($value, $invalidBehavior, $strict);
446              }
447          }
448   
449          return $value;
450      }
451   
452      /**
453       * Loads from Extensions.
454       *
455       * @param array $content
456       */
457      private function loadFromExtensions($content)
458      {
459          foreach ($content as $namespace => $values) {
460              if (in_array($namespace, array('imports', 'parameters', 'services'))) {
461                  continue;
462              }
463   
464              if (!is_array($values)) {
465                  $values = array();
466              }
467   
468              $this->container->loadFromExtension($namespace, $values);
469          }
470      }
471  }
472