vendor/friendsofsymfony/rest-bundle/Routing/Loader/RestYamlCollectionLoader.php line 14

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the FOSRestBundle package.
  4.  *
  5.  * (c) FriendsOfSymfony <http://friendsofsymfony.github.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 FOS\RestBundle\Routing\Loader;
  11. @trigger_error(sprintf('The %s\RestYamlCollectionLoader class is deprecated since FOSRestBundle 2.8.'__NAMESPACE__), E_USER_DEPRECATED);
  12. use FOS\RestBundle\Routing\RestRouteCollection;
  13. use Symfony\Component\Config\FileLocatorInterface;
  14. use Symfony\Component\Config\Resource\FileResource;
  15. use Symfony\Component\Routing\Loader\YamlFileLoader;
  16. use Symfony\Component\Routing\RouteCollection;
  17. use Symfony\Component\Yaml\Exception\ParseException;
  18. use Symfony\Component\Yaml\Yaml;
  19. /**
  20.  * RestYamlCollectionLoader YAML file collections loader.
  21.  *
  22.  * @deprecated since 2.8
  23.  */
  24. class RestYamlCollectionLoader extends YamlFileLoader
  25. {
  26.     protected $collectionParents = [];
  27.     private $processor;
  28.     private $includeFormat;
  29.     private $formats;
  30.     private $defaultFormat;
  31.     /**
  32.      * @param string[] $formats
  33.      */
  34.     public function __construct(
  35.         FileLocatorInterface $locator,
  36.         RestRouteProcessor $processor,
  37.         bool $includeFormat true,
  38.         array $formats = [],
  39.         string $defaultFormat null
  40.     ) {
  41.         parent::__construct($locator);
  42.         $this->processor $processor;
  43.         $this->includeFormat $includeFormat;
  44.         $this->formats $formats;
  45.         $this->defaultFormat $defaultFormat;
  46.     }
  47.     /**
  48.      * {@inheritdoc}
  49.      */
  50.     public function load($file$type null)
  51.     {
  52.         $path $this->locator->locate($file);
  53.         try {
  54.             $config Yaml::parse(file_get_contents($path));
  55.         } catch (ParseException $e) {
  56.             throw new \InvalidArgumentException(sprintf('The file "%s" does not contain valid YAML.'$path), 0$e);
  57.         }
  58.         $collection = new RouteCollection();
  59.         $collection->addResource(new FileResource($path));
  60.         // empty file
  61.         if (null === $config) {
  62.             return $collection;
  63.         }
  64.         // not an array
  65.         if (!is_array($config)) {
  66.             throw new \InvalidArgumentException(sprintf('The file "%s" must contain a Yaml mapping (an array).'$path));
  67.         }
  68.         // process routes and imports
  69.         foreach ($config as $name => $config) {
  70.             if (isset($config['resource'])) {
  71.                 $resource $config['resource'];
  72.                 $prefix = isset($config['prefix']) ? $config['prefix'] : null;
  73.                 $namePrefix = isset($config['name_prefix']) ? $config['name_prefix'] : null;
  74.                 $parent = isset($config['parent']) ? $config['parent'] : null;
  75.                 $type = isset($config['type']) ? $config['type'] : null;
  76.                 $host = isset($config['host']) ? $config['host'] : null;
  77.                 $requirements = isset($config['requirements']) ? $config['requirements'] : [];
  78.                 $defaults = isset($config['defaults']) ? $config['defaults'] : [];
  79.                 $options = isset($config['options']) ? $config['options'] : [];
  80.                 $currentDir dirname($path);
  81.                 $parents = [];
  82.                 if (!empty($parent)) {
  83.                     if (!isset($this->collectionParents[$parent])) {
  84.                         throw new \InvalidArgumentException(sprintf('Cannot find parent resource with name %s'$parent));
  85.                     }
  86.                     $parents $this->collectionParents[$parent];
  87.                 }
  88.                 $imported $this->processor->importResource($this$resource$parents$prefix$namePrefix$type$currentDir);
  89.                 if ($imported instanceof RestRouteCollection) {
  90.                     $parents[] = ($prefix $prefix.'/' '').$imported->getSingularName();
  91.                     $prefix null;
  92.                     $namePrefix null;
  93.                     $this->collectionParents[$name] = $parents;
  94.                 }
  95.                 $imported->addRequirements($requirements);
  96.                 $imported->addDefaults($defaults);
  97.                 $imported->addOptions($options);
  98.                 if (!empty($host)) {
  99.                     $imported->setHost($host);
  100.                 }
  101.                 $imported->addPrefix((string) $prefix);
  102.                 // Add name prefix from parent config files
  103.                 $imported $this->addParentNamePrefix($imported$namePrefix);
  104.                 $collection->addCollection($imported);
  105.             } elseif (isset($config['pattern']) || isset($config['path'])) {
  106.                 // the YamlFileLoader of the Routing component only checks for
  107.                 // the path option
  108.                 if (!isset($config['path'])) {
  109.                     $config['path'] = $config['pattern'];
  110.                     @trigger_error(sprintf('The "pattern" option at "%s" in file "%s" is deprecated. Use the "path" option instead.'$name$path), E_USER_DEPRECATED);
  111.                 }
  112.                 if ($this->includeFormat) {
  113.                     // append format placeholder if not present
  114.                     if (false === strpos($config['path'], '{_format}')) {
  115.                         $config['path'] .= '.{_format}';
  116.                     }
  117.                     // set format requirement if configured globally
  118.                     if (!isset($config['requirements']['_format']) && !empty($this->formats)) {
  119.                         $config['requirements']['_format'] = implode('|'array_keys($this->formats));
  120.                     }
  121.                 }
  122.                 // set the default format if configured
  123.                 if (null !== $this->defaultFormat) {
  124.                     $config['defaults']['_format'] = $this->defaultFormat;
  125.                 }
  126.                 $this->parseRoute($collection$name$config$path);
  127.             } else {
  128.                 throw new \InvalidArgumentException(sprintf('Unable to parse the "%s" route.'$name));
  129.             }
  130.         }
  131.         return $collection;
  132.     }
  133.     /**
  134.      * {@inheritdoc}
  135.      */
  136.     public function supports($resource$type null)
  137.     {
  138.         return 'rest' === $type && is_string($resource) &&
  139.             in_array(pathinfo($resourcePATHINFO_EXTENSION), ['yaml''yml'], true);
  140.     }
  141.     /**
  142.      * @param string $namePrefix
  143.      *
  144.      * @return RouteCollection
  145.      */
  146.     public function addParentNamePrefix(RouteCollection $collection$namePrefix)
  147.     {
  148.         if (!isset($namePrefix) || '' === ($namePrefix trim($namePrefix))) {
  149.             return $collection;
  150.         }
  151.         $iterator $collection->getIterator();
  152.         foreach ($iterator as $key1 => $route1) {
  153.             $collection->add($namePrefix.$key1$route1);
  154.             $collection->remove($key1);
  155.         }
  156.         return $collection;
  157.     }
  158. }