123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Validator\Mapping\Loader;
- use Symfony\Component\Validator\Mapping\ClassMetadata;
- use Symfony\Component\Yaml\Exception\ParseException;
- use Symfony\Component\Yaml\Parser as YamlParser;
- use Symfony\Component\Yaml\Yaml;
- /**
- * Loads validation metadata from a YAML file.
- *
- * @author Bernhard Schussek <bschussek@gmail.com>
- */
- class YamlFileLoader extends FileLoader
- {
- /**
- * An array of YAML class descriptions.
- *
- * @var array
- */
- protected $classes = null;
- /**
- * Caches the used YAML parser.
- *
- * @var YamlParser
- */
- private $yamlParser;
- /**
- * {@inheritdoc}
- */
- public function loadClassMetadata(ClassMetadata $metadata)
- {
- if (null === $this->classes) {
- $this->loadClassesFromYaml();
- }
- if (isset($this->classes[$metadata->getClassName()])) {
- $classDescription = $this->classes[$metadata->getClassName()];
- $this->loadClassMetadataFromYaml($metadata, $classDescription);
- return true;
- }
- return false;
- }
- /**
- * Return the names of the classes mapped in this file.
- *
- * @return string[] The classes names
- */
- public function getMappedClasses()
- {
- if (null === $this->classes) {
- $this->loadClassesFromYaml();
- }
- return array_keys($this->classes);
- }
- /**
- * Parses a collection of YAML nodes.
- *
- * @param array $nodes The YAML nodes
- *
- * @return array An array of values or Constraint instances
- */
- protected function parseNodes(array $nodes)
- {
- $values = [];
- foreach ($nodes as $name => $childNodes) {
- if (is_numeric($name) && \is_array($childNodes) && 1 === \count($childNodes)) {
- $options = current($childNodes);
- if (\is_array($options)) {
- $options = $this->parseNodes($options);
- }
- $values[] = $this->newConstraint(key($childNodes), $options);
- } else {
- if (\is_array($childNodes)) {
- $childNodes = $this->parseNodes($childNodes);
- }
- $values[$name] = $childNodes;
- }
- }
- return $values;
- }
- /**
- * Loads the YAML class descriptions from the given file.
- *
- * @throws \InvalidArgumentException If the file could not be loaded or did
- * not contain a YAML array
- */
- private function parseFile(string $path): array
- {
- try {
- $classes = $this->yamlParser->parseFile($path, Yaml::PARSE_CONSTANT);
- } catch (ParseException $e) {
- throw new \InvalidArgumentException(sprintf('The file "%s" does not contain valid YAML: ', $path).$e->getMessage(), 0, $e);
- }
- // empty file
- if (null === $classes) {
- return [];
- }
- // not an array
- if (!\is_array($classes)) {
- throw new \InvalidArgumentException(sprintf('The file "%s" must contain a YAML array.', $this->file));
- }
- return $classes;
- }
- private function loadClassesFromYaml()
- {
- if (null === $this->yamlParser) {
- $this->yamlParser = new YamlParser();
- }
- $this->classes = $this->parseFile($this->file);
- if (isset($this->classes['namespaces'])) {
- foreach ($this->classes['namespaces'] as $alias => $namespace) {
- $this->addNamespaceAlias($alias, $namespace);
- }
- unset($this->classes['namespaces']);
- }
- }
- private function loadClassMetadataFromYaml(ClassMetadata $metadata, array $classDescription)
- {
- if (isset($classDescription['group_sequence_provider'])) {
- $metadata->setGroupSequenceProvider(
- (bool) $classDescription['group_sequence_provider']
- );
- }
- if (isset($classDescription['group_sequence'])) {
- $metadata->setGroupSequence($classDescription['group_sequence']);
- }
- if (isset($classDescription['constraints']) && \is_array($classDescription['constraints'])) {
- foreach ($this->parseNodes($classDescription['constraints']) as $constraint) {
- $metadata->addConstraint($constraint);
- }
- }
- if (isset($classDescription['properties']) && \is_array($classDescription['properties'])) {
- foreach ($classDescription['properties'] as $property => $constraints) {
- if (null !== $constraints) {
- foreach ($this->parseNodes($constraints) as $constraint) {
- $metadata->addPropertyConstraint($property, $constraint);
- }
- }
- }
- }
- if (isset($classDescription['getters']) && \is_array($classDescription['getters'])) {
- foreach ($classDescription['getters'] as $getter => $constraints) {
- if (null !== $constraints) {
- foreach ($this->parseNodes($constraints) as $constraint) {
- $metadata->addGetterConstraint($getter, $constraint);
- }
- }
- }
- }
- }
- }
|