annotate vendor/symfony/validator/Mapping/Loader/YamlFileLoader.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /*
Chris@0 4 * This file is part of the Symfony package.
Chris@0 5 *
Chris@0 6 * (c) Fabien Potencier <fabien@symfony.com>
Chris@0 7 *
Chris@0 8 * For the full copyright and license information, please view the LICENSE
Chris@0 9 * file that was distributed with this source code.
Chris@0 10 */
Chris@0 11
Chris@0 12 namespace Symfony\Component\Validator\Mapping\Loader;
Chris@0 13
Chris@0 14 use Symfony\Component\Validator\Mapping\ClassMetadata;
Chris@0 15 use Symfony\Component\Yaml\Exception\ParseException;
Chris@0 16 use Symfony\Component\Yaml\Parser as YamlParser;
Chris@0 17
Chris@0 18 /**
Chris@0 19 * Loads validation metadata from a YAML file.
Chris@0 20 *
Chris@0 21 * @author Bernhard Schussek <bschussek@gmail.com>
Chris@0 22 */
Chris@0 23 class YamlFileLoader extends FileLoader
Chris@0 24 {
Chris@0 25 /**
Chris@0 26 * An array of YAML class descriptions.
Chris@0 27 *
Chris@0 28 * @var array
Chris@0 29 */
Chris@0 30 protected $classes = null;
Chris@0 31
Chris@0 32 /**
Chris@0 33 * Caches the used YAML parser.
Chris@0 34 *
Chris@0 35 * @var YamlParser
Chris@0 36 */
Chris@0 37 private $yamlParser;
Chris@0 38
Chris@0 39 /**
Chris@0 40 * {@inheritdoc}
Chris@0 41 */
Chris@0 42 public function loadClassMetadata(ClassMetadata $metadata)
Chris@0 43 {
Chris@0 44 if (null === $this->classes) {
Chris@0 45 $this->loadClassesFromYaml();
Chris@0 46 }
Chris@0 47
Chris@0 48 if (isset($this->classes[$metadata->getClassName()])) {
Chris@0 49 $classDescription = $this->classes[$metadata->getClassName()];
Chris@0 50
Chris@0 51 $this->loadClassMetadataFromYaml($metadata, $classDescription);
Chris@0 52
Chris@0 53 return true;
Chris@0 54 }
Chris@0 55
Chris@0 56 return false;
Chris@0 57 }
Chris@0 58
Chris@0 59 /**
Chris@0 60 * Return the names of the classes mapped in this file.
Chris@0 61 *
Chris@0 62 * @return string[] The classes names
Chris@0 63 */
Chris@0 64 public function getMappedClasses()
Chris@0 65 {
Chris@0 66 if (null === $this->classes) {
Chris@0 67 $this->loadClassesFromYaml();
Chris@0 68 }
Chris@0 69
Chris@0 70 return array_keys($this->classes);
Chris@0 71 }
Chris@0 72
Chris@0 73 /**
Chris@0 74 * Parses a collection of YAML nodes.
Chris@0 75 *
Chris@0 76 * @param array $nodes The YAML nodes
Chris@0 77 *
Chris@0 78 * @return array An array of values or Constraint instances
Chris@0 79 */
Chris@0 80 protected function parseNodes(array $nodes)
Chris@0 81 {
Chris@0 82 $values = array();
Chris@0 83
Chris@0 84 foreach ($nodes as $name => $childNodes) {
Chris@0 85 if (is_numeric($name) && is_array($childNodes) && 1 === count($childNodes)) {
Chris@0 86 $options = current($childNodes);
Chris@0 87
Chris@0 88 if (is_array($options)) {
Chris@0 89 $options = $this->parseNodes($options);
Chris@0 90 }
Chris@0 91
Chris@0 92 $values[] = $this->newConstraint(key($childNodes), $options);
Chris@0 93 } else {
Chris@0 94 if (is_array($childNodes)) {
Chris@0 95 $childNodes = $this->parseNodes($childNodes);
Chris@0 96 }
Chris@0 97
Chris@0 98 $values[$name] = $childNodes;
Chris@0 99 }
Chris@0 100 }
Chris@0 101
Chris@0 102 return $values;
Chris@0 103 }
Chris@0 104
Chris@0 105 /**
Chris@0 106 * Loads the YAML class descriptions from the given file.
Chris@0 107 *
Chris@0 108 * @param string $path The path of the YAML file
Chris@0 109 *
Chris@0 110 * @return array The class descriptions
Chris@0 111 *
Chris@0 112 * @throws \InvalidArgumentException If the file could not be loaded or did
Chris@0 113 * not contain a YAML array
Chris@0 114 */
Chris@0 115 private function parseFile($path)
Chris@0 116 {
Chris@0 117 try {
Chris@0 118 $classes = $this->yamlParser->parse(file_get_contents($path));
Chris@0 119 } catch (ParseException $e) {
Chris@0 120 throw new \InvalidArgumentException(sprintf('The file "%s" does not contain valid YAML.', $path), 0, $e);
Chris@0 121 }
Chris@0 122
Chris@0 123 // empty file
Chris@0 124 if (null === $classes) {
Chris@0 125 return array();
Chris@0 126 }
Chris@0 127
Chris@0 128 // not an array
Chris@0 129 if (!is_array($classes)) {
Chris@0 130 throw new \InvalidArgumentException(sprintf('The file "%s" must contain a YAML array.', $this->file));
Chris@0 131 }
Chris@0 132
Chris@0 133 return $classes;
Chris@0 134 }
Chris@0 135
Chris@0 136 private function loadClassesFromYaml()
Chris@0 137 {
Chris@0 138 if (null === $this->yamlParser) {
Chris@0 139 $this->yamlParser = new YamlParser();
Chris@0 140 }
Chris@0 141
Chris@0 142 $this->classes = $this->parseFile($this->file);
Chris@0 143
Chris@0 144 if (isset($this->classes['namespaces'])) {
Chris@0 145 foreach ($this->classes['namespaces'] as $alias => $namespace) {
Chris@0 146 $this->addNamespaceAlias($alias, $namespace);
Chris@0 147 }
Chris@0 148
Chris@0 149 unset($this->classes['namespaces']);
Chris@0 150 }
Chris@0 151 }
Chris@0 152
Chris@0 153 private function loadClassMetadataFromYaml(ClassMetadata $metadata, array $classDescription)
Chris@0 154 {
Chris@0 155 if (isset($classDescription['group_sequence_provider'])) {
Chris@0 156 $metadata->setGroupSequenceProvider(
Chris@0 157 (bool) $classDescription['group_sequence_provider']
Chris@0 158 );
Chris@0 159 }
Chris@0 160
Chris@0 161 if (isset($classDescription['group_sequence'])) {
Chris@0 162 $metadata->setGroupSequence($classDescription['group_sequence']);
Chris@0 163 }
Chris@0 164
Chris@0 165 if (isset($classDescription['constraints']) && is_array($classDescription['constraints'])) {
Chris@0 166 foreach ($this->parseNodes($classDescription['constraints']) as $constraint) {
Chris@0 167 $metadata->addConstraint($constraint);
Chris@0 168 }
Chris@0 169 }
Chris@0 170
Chris@0 171 if (isset($classDescription['properties']) && is_array($classDescription['properties'])) {
Chris@0 172 foreach ($classDescription['properties'] as $property => $constraints) {
Chris@0 173 if (null !== $constraints) {
Chris@0 174 foreach ($this->parseNodes($constraints) as $constraint) {
Chris@0 175 $metadata->addPropertyConstraint($property, $constraint);
Chris@0 176 }
Chris@0 177 }
Chris@0 178 }
Chris@0 179 }
Chris@0 180
Chris@0 181 if (isset($classDescription['getters']) && is_array($classDescription['getters'])) {
Chris@0 182 foreach ($classDescription['getters'] as $getter => $constraints) {
Chris@0 183 if (null !== $constraints) {
Chris@0 184 foreach ($this->parseNodes($constraints) as $constraint) {
Chris@0 185 $metadata->addGetterConstraint($getter, $constraint);
Chris@0 186 }
Chris@0 187 }
Chris@0 188 }
Chris@0 189 }
Chris@0 190 }
Chris@0 191 }