vendor/friendsofsymfony/rest-bundle/Routing/Loader/RestRouteLoader.php line 54

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\RestRouteLoader class is deprecated since FOSRestBundle 2.8.'__NAMESPACE__), E_USER_DEPRECATED);
  12. use FOS\RestBundle\Routing\Loader\Reader\RestControllerReader;
  13. use Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser;
  14. use Symfony\Component\Config\FileLocatorInterface;
  15. use Symfony\Component\Config\Loader\Loader;
  16. use Symfony\Component\DependencyInjection\ContainerInterface;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpKernel\Kernel;
  19. /**
  20.  * RestRouteLoader REST-enabled controller router loader.
  21.  *
  22.  * @author Konstantin Kudryashov <ever.zet@gmail.com>
  23.  * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
  24.  *
  25.  * @deprecated since 2.8
  26.  */
  27. class RestRouteLoader extends Loader
  28. {
  29.     protected $container;
  30.     protected $controllerParser;
  31.     protected $controllerReader;
  32.     protected $defaultFormat;
  33.     protected $locator;
  34.     /**
  35.      * @param RestControllerReader $controllerReader
  36.      * @param string               $defaultFormat
  37.      */
  38.     public function __construct(
  39.         ContainerInterface $container,
  40.         FileLocatorInterface $locator,
  41.         $controllerReader,
  42.         $defaultFormat 'html'
  43.     ) {
  44.         $this->container $container;
  45.         $this->locator $locator;
  46.         if ($controllerReader instanceof ControllerNameParser || null === $controllerReader) {
  47.             @trigger_error(sprintf('Not passing an instance of %s as the 3rd argument of %s() is deprecated since FOSRestBundle 2.8.'RestControllerReader::class, __METHOD__), E_USER_DEPRECATED);
  48.             $this->controllerParser $controllerReader;
  49.             if (!$defaultFormat instanceof RestControllerReader) {
  50.                 throw new \TypeError(sprintf('Argument 4 passed to %s() must be an instance of %s, %s given.'__METHOD__RestControllerReader::class, is_object($defaultFormat) ? get_class($defaultFormat) : gettype($defaultFormat)));
  51.             }
  52.             $this->controllerReader $defaultFormat;
  53.             $this->defaultFormat func_num_args() > func_get_arg(4) : 'html';
  54.         } elseif (!$controllerReader instanceof RestControllerReader) {
  55.             throw new \TypeError(sprintf('Argument 3 passed to %s() must be an instance of %s, %s given.'__METHOD__RestControllerReader::class, is_object($controllerReader) ? get_class($controllerReader) : gettype($controllerReader)));
  56.         } else {
  57.             $this->controllerReader $controllerReader;
  58.             $this->defaultFormat $defaultFormat;
  59.         }
  60.     }
  61.     /**
  62.      * @return RestControllerReader
  63.      */
  64.     public function getControllerReader()
  65.     {
  66.         return $this->controllerReader;
  67.     }
  68.     /**
  69.      * {@inheritdoc}
  70.      */
  71.     public function load($controller$type null)
  72.     {
  73.         list($prefix$class) = $this->getControllerLocator($controller);
  74.         $collection $this->controllerReader->read(new \ReflectionClass($class));
  75.         $collection->prependRouteControllersWithPrefix($prefix);
  76.         $collection->setDefaultFormat($this->defaultFormat);
  77.         return $collection;
  78.     }
  79.     /**
  80.      * {@inheritdoc}
  81.      */
  82.     public function supports($resource$type null)
  83.     {
  84.         return is_string($resource)
  85.             && 'rest' === $type
  86.             && !in_array(
  87.                 pathinfo($resourcePATHINFO_EXTENSION),
  88.                 ['xml''yml''yaml']
  89.             );
  90.     }
  91.     private function getControllerLocator(string $controller): array
  92.     {
  93.         $class null;
  94.         $prefix null;
  95.         if (=== strpos($controller'@')) {
  96.             $file $this->locator->locate($controller);
  97.             $controllerClass ClassUtils::findClassInFile($file);
  98.             if (null === $controllerClass) {
  99.                 throw new \InvalidArgumentException(sprintf('Can\'t find class for controller "%s"'$controller));
  100.             }
  101.             $controller $controllerClass;
  102.         }
  103.         if ($this->container->has($controller)) {
  104.             // service_id
  105.             $prefix $controller.':';
  106.             if (Kernel::VERSION_ID >= 40100) {
  107.                 $prefix .= ':';
  108.             }
  109.             $useScope method_exists($this->container'enterScope') && $this->container->hasScope('request');
  110.             if ($useScope) {
  111.                 $this->container->enterScope('request');
  112.                 $this->container->set('request', new Request());
  113.             }
  114.             $class get_class($this->container->get($controller));
  115.             if ($useScope) {
  116.                 $this->container->leaveScope('request');
  117.             }
  118.         } elseif (class_exists($controller)) {
  119.             // full class name
  120.             $class $controller;
  121.             $prefix $class.'::';
  122.         } elseif ($this->controllerParser && false !== strpos($controller':')) {
  123.             // bundle:controller notation
  124.             try {
  125.                 $notation $this->controllerParser->parse($controller.':method');
  126.                 list($class) = explode('::'$notation);
  127.                 $prefix $class.'::';
  128.             } catch (\Exception $e) {
  129.                 throw new \InvalidArgumentException(sprintf('Can\'t locate "%s" controller.'$controller));
  130.             }
  131.         }
  132.         if (empty($class)) {
  133.             throw new \InvalidArgumentException(sprintf('Class could not be determined for Controller identified by "%s".'$controller));
  134.         }
  135.         return [$prefix$class];
  136.     }
  137. }