PageRenderTime 48ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php

https://gitlab.com/Marwamimo/Crowdrise_Web
PHP | 396 lines | 235 code | 62 blank | 99 comment | 22 complexity | 1d37e528ef7a99b445691c3a78f42317 MD5 | raw file
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Bundle\FrameworkBundle\Console\Descriptor;
  11. use Symfony\Component\DependencyInjection\Alias;
  12. use Symfony\Component\DependencyInjection\ContainerBuilder;
  13. use Symfony\Component\DependencyInjection\Definition;
  14. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
  15. use Symfony\Component\Routing\Route;
  16. use Symfony\Component\Routing\RouteCollection;
  17. /**
  18. * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
  19. */
  20. class XmlDescriptor extends Descriptor
  21. {
  22. /**
  23. * {@inheritdoc}
  24. */
  25. protected function describeRouteCollection(RouteCollection $routes, array $options = array())
  26. {
  27. $this->writeDocument($this->getRouteCollectionDocument($routes));
  28. }
  29. /**
  30. * {@inheritdoc}
  31. */
  32. protected function describeRoute(Route $route, array $options = array())
  33. {
  34. $this->writeDocument($this->getRouteDocument($route, isset($options['name']) ? $options['name'] : null));
  35. }
  36. /**
  37. * {@inheritdoc}
  38. */
  39. protected function describeContainerParameters(ParameterBag $parameters, array $options = array())
  40. {
  41. $this->writeDocument($this->getContainerParametersDocument($parameters));
  42. }
  43. /**
  44. * {@inheritdoc}
  45. */
  46. protected function describeContainerTags(ContainerBuilder $builder, array $options = array())
  47. {
  48. $this->writeDocument($this->getContainerTagsDocument($builder, isset($options['show_private']) && $options['show_private']));
  49. }
  50. /**
  51. * {@inheritdoc}
  52. */
  53. protected function describeContainerService($service, array $options = array())
  54. {
  55. if (!isset($options['id'])) {
  56. throw new \InvalidArgumentException('An "id" option must be provided.');
  57. }
  58. $this->writeDocument($this->getContainerServiceDocument($service, $options['id']));
  59. }
  60. /**
  61. * {@inheritdoc}
  62. */
  63. protected function describeContainerServices(ContainerBuilder $builder, array $options = array())
  64. {
  65. $this->writeDocument($this->getContainerServicesDocument($builder, isset($options['tag']) ? $options['tag'] : null, isset($options['show_private']) && $options['show_private']));
  66. }
  67. /**
  68. * {@inheritdoc}
  69. */
  70. protected function describeContainerDefinition(Definition $definition, array $options = array())
  71. {
  72. $this->writeDocument($this->getContainerDefinitionDocument($definition, isset($options['id']) ? $options['id'] : null, isset($options['omit_tags']) && $options['omit_tags']));
  73. }
  74. /**
  75. * {@inheritdoc}
  76. */
  77. protected function describeContainerAlias(Alias $alias, array $options = array())
  78. {
  79. $this->writeDocument($this->getContainerAliasDocument($alias, isset($options['id']) ? $options['id'] : null));
  80. }
  81. /**
  82. * {@inheritdoc}
  83. */
  84. protected function describeContainerParameter($parameter, array $options = array())
  85. {
  86. $this->writeDocument($this->getContainerParameterDocument($parameter, $options));
  87. }
  88. /**
  89. * Writes DOM document.
  90. *
  91. * @param \DOMDocument $dom
  92. *
  93. * @return \DOMDocument|string
  94. */
  95. private function writeDocument(\DOMDocument $dom)
  96. {
  97. $dom->formatOutput = true;
  98. $this->write($dom->saveXML());
  99. }
  100. /**
  101. * @param RouteCollection $routes
  102. *
  103. * @return \DOMDocument
  104. */
  105. private function getRouteCollectionDocument(RouteCollection $routes)
  106. {
  107. $dom = new \DOMDocument('1.0', 'UTF-8');
  108. $dom->appendChild($routesXML = $dom->createElement('routes'));
  109. foreach ($routes->all() as $name => $route) {
  110. $routeXML = $this->getRouteDocument($route, $name);
  111. $routesXML->appendChild($routesXML->ownerDocument->importNode($routeXML->childNodes->item(0), true));
  112. }
  113. return $dom;
  114. }
  115. /**
  116. * @param Route $route
  117. * @param string|null $name
  118. *
  119. * @return \DOMDocument
  120. */
  121. private function getRouteDocument(Route $route, $name = null)
  122. {
  123. $dom = new \DOMDocument('1.0', 'UTF-8');
  124. $dom->appendChild($routeXML = $dom->createElement('route'));
  125. if ($name) {
  126. $routeXML->setAttribute('name', $name);
  127. }
  128. $routeXML->setAttribute('class', get_class($route));
  129. $routeXML->appendChild($pathXML = $dom->createElement('path'));
  130. $pathXML->setAttribute('regex', $route->compile()->getRegex());
  131. $pathXML->appendChild(new \DOMText($route->getPath()));
  132. if ('' !== $route->getHost()) {
  133. $routeXML->appendChild($hostXML = $dom->createElement('host'));
  134. $hostXML->setAttribute('regex', $route->compile()->getHostRegex());
  135. $hostXML->appendChild(new \DOMText($route->getHost()));
  136. }
  137. foreach ($route->getSchemes() as $scheme) {
  138. $routeXML->appendChild($schemeXML = $dom->createElement('scheme'));
  139. $schemeXML->appendChild(new \DOMText($scheme));
  140. }
  141. foreach ($route->getMethods() as $method) {
  142. $routeXML->appendChild($methodXML = $dom->createElement('method'));
  143. $methodXML->appendChild(new \DOMText($method));
  144. }
  145. if (count($route->getDefaults())) {
  146. $routeXML->appendChild($defaultsXML = $dom->createElement('defaults'));
  147. foreach ($route->getDefaults() as $attribute => $value) {
  148. $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
  149. $defaultXML->setAttribute('key', $attribute);
  150. $defaultXML->appendChild(new \DOMText($this->formatValue($value)));
  151. }
  152. }
  153. $requirements = $route->getRequirements();
  154. unset($requirements['_scheme'], $requirements['_method']);
  155. if (count($requirements)) {
  156. $routeXML->appendChild($requirementsXML = $dom->createElement('requirements'));
  157. foreach ($requirements as $attribute => $pattern) {
  158. $requirementsXML->appendChild($requirementXML = $dom->createElement('requirement'));
  159. $requirementXML->setAttribute('key', $attribute);
  160. $requirementXML->appendChild(new \DOMText($pattern));
  161. }
  162. }
  163. if (count($route->getOptions())) {
  164. $routeXML->appendChild($optionsXML = $dom->createElement('options'));
  165. foreach ($route->getOptions() as $name => $value) {
  166. $optionsXML->appendChild($optionXML = $dom->createElement('option'));
  167. $optionXML->setAttribute('key', $name);
  168. $optionXML->appendChild(new \DOMText($this->formatValue($value)));
  169. }
  170. }
  171. return $dom;
  172. }
  173. /**
  174. * @param ParameterBag $parameters
  175. *
  176. * @return \DOMDocument
  177. */
  178. private function getContainerParametersDocument(ParameterBag $parameters)
  179. {
  180. $dom = new \DOMDocument('1.0', 'UTF-8');
  181. $dom->appendChild($parametersXML = $dom->createElement('parameters'));
  182. foreach ($this->sortParameters($parameters) as $key => $value) {
  183. $parametersXML->appendChild($parameterXML = $dom->createElement('parameter'));
  184. $parameterXML->setAttribute('key', $key);
  185. $parameterXML->appendChild(new \DOMText($this->formatParameter($value)));
  186. }
  187. return $dom;
  188. }
  189. /**
  190. * @param ContainerBuilder $builder
  191. * @param bool $showPrivate
  192. *
  193. * @return \DOMDocument
  194. */
  195. private function getContainerTagsDocument(ContainerBuilder $builder, $showPrivate = false)
  196. {
  197. $dom = new \DOMDocument('1.0', 'UTF-8');
  198. $dom->appendChild($containerXML = $dom->createElement('container'));
  199. foreach ($this->findDefinitionsByTag($builder, $showPrivate) as $tag => $definitions) {
  200. $containerXML->appendChild($tagXML = $dom->createElement('tag'));
  201. $tagXML->setAttribute('name', $tag);
  202. foreach ($definitions as $serviceId => $definition) {
  203. $definitionXML = $this->getContainerDefinitionDocument($definition, $serviceId, true);
  204. $tagXML->appendChild($dom->importNode($definitionXML->childNodes->item(0), true));
  205. }
  206. }
  207. return $dom;
  208. }
  209. /**
  210. * @param mixed $service
  211. * @param string $id
  212. *
  213. * @return \DOMDocument
  214. */
  215. private function getContainerServiceDocument($service, $id)
  216. {
  217. $dom = new \DOMDocument('1.0', 'UTF-8');
  218. if ($service instanceof Alias) {
  219. $dom->appendChild($dom->importNode($this->getContainerAliasDocument($service, $id)->childNodes->item(0), true));
  220. } elseif ($service instanceof Definition) {
  221. $dom->appendChild($dom->importNode($this->getContainerDefinitionDocument($service, $id)->childNodes->item(0), true));
  222. } else {
  223. $dom->appendChild($serviceXML = $dom->createElement('service'));
  224. $serviceXML->setAttribute('id', $id);
  225. $serviceXML->setAttribute('class', get_class($service));
  226. }
  227. return $dom;
  228. }
  229. /**
  230. * @param ContainerBuilder $builder
  231. * @param string|null $tag
  232. * @param bool $showPrivate
  233. *
  234. * @return \DOMDocument
  235. */
  236. private function getContainerServicesDocument(ContainerBuilder $builder, $tag = null, $showPrivate = false)
  237. {
  238. $dom = new \DOMDocument('1.0', 'UTF-8');
  239. $dom->appendChild($containerXML = $dom->createElement('container'));
  240. $serviceIds = $tag ? array_keys($builder->findTaggedServiceIds($tag)) : $builder->getServiceIds();
  241. foreach ($this->sortServiceIds($serviceIds) as $serviceId) {
  242. $service = $this->resolveServiceDefinition($builder, $serviceId);
  243. if ($service instanceof Definition && !($showPrivate || $service->isPublic())) {
  244. continue;
  245. }
  246. $serviceXML = $this->getContainerServiceDocument($service, $serviceId);
  247. $containerXML->appendChild($containerXML->ownerDocument->importNode($serviceXML->childNodes->item(0), true));
  248. }
  249. return $dom;
  250. }
  251. /**
  252. * @param Definition $definition
  253. * @param string|null $id
  254. * @param bool $omitTags
  255. *
  256. * @return \DOMDocument
  257. */
  258. private function getContainerDefinitionDocument(Definition $definition, $id = null, $omitTags = false)
  259. {
  260. $dom = new \DOMDocument('1.0', 'UTF-8');
  261. $dom->appendChild($serviceXML = $dom->createElement('definition'));
  262. if ($id) {
  263. $serviceXML->setAttribute('id', $id);
  264. }
  265. $serviceXML->setAttribute('class', $definition->getClass());
  266. if ($definition->getFactoryClass()) {
  267. $serviceXML->setAttribute('factory-class', $definition->getFactoryClass());
  268. }
  269. if ($definition->getFactoryService()) {
  270. $serviceXML->setAttribute('factory-service', $definition->getFactoryService());
  271. }
  272. if ($definition->getFactoryMethod()) {
  273. $serviceXML->setAttribute('factory-method', $definition->getFactoryMethod());
  274. }
  275. $serviceXML->setAttribute('scope', $definition->getScope());
  276. $serviceXML->setAttribute('public', $definition->isPublic() ? 'true' : 'false');
  277. $serviceXML->setAttribute('synthetic', $definition->isSynthetic() ? 'true' : 'false');
  278. $serviceXML->setAttribute('lazy', $definition->isLazy() ? 'true' : 'false');
  279. $serviceXML->setAttribute('synchronized', $definition->isSynchronized() ? 'true' : 'false');
  280. $serviceXML->setAttribute('abstract', $definition->isAbstract() ? 'true' : 'false');
  281. $serviceXML->setAttribute('file', $definition->getFile());
  282. if (!$omitTags) {
  283. $tags = $definition->getTags();
  284. if (count($tags) > 0) {
  285. $serviceXML->appendChild($tagsXML = $dom->createElement('tags'));
  286. foreach ($tags as $tagName => $tagData) {
  287. foreach ($tagData as $parameters) {
  288. $tagsXML->appendChild($tagXML = $dom->createElement('tag'));
  289. $tagXML->setAttribute('name', $tagName);
  290. foreach ($parameters as $name => $value) {
  291. $tagXML->appendChild($parameterXML = $dom->createElement('parameter'));
  292. $parameterXML->setAttribute('name', $name);
  293. $parameterXML->appendChild(new \DOMText($this->formatParameter($value)));
  294. }
  295. }
  296. }
  297. }
  298. }
  299. return $dom;
  300. }
  301. /**
  302. * @param Alias $alias
  303. * @param string|null $id
  304. *
  305. * @return \DOMDocument
  306. */
  307. private function getContainerAliasDocument(Alias $alias, $id = null)
  308. {
  309. $dom = new \DOMDocument('1.0', 'UTF-8');
  310. $dom->appendChild($aliasXML = $dom->createElement('alias'));
  311. if ($id) {
  312. $aliasXML->setAttribute('id', $id);
  313. }
  314. $aliasXML->setAttribute('service', (string) $alias);
  315. $aliasXML->setAttribute('public', $alias->isPublic() ? 'true' : 'false');
  316. return $dom;
  317. }
  318. /**
  319. * @param string $parameter
  320. * @param array $options
  321. *
  322. * @return \DOMDocument
  323. */
  324. private function getContainerParameterDocument($parameter, $options = array())
  325. {
  326. $dom = new \DOMDocument('1.0', 'UTF-8');
  327. $dom->appendChild($parameterXML = $dom->createElement('parameter'));
  328. if (isset($options['parameter'])) {
  329. $parameterXML->setAttribute('key', $options['parameter']);
  330. }
  331. $parameterXML->appendChild(new \DOMText($this->formatParameter($parameter)));
  332. return $dom;
  333. }
  334. }