vendor/friendsofsymfony/rest-bundle/Request/ParamReader.php line 45

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\Request;
  11. use Doctrine\Common\Annotations\Reader;
  12. use FOS\RestBundle\Controller\Annotations\ParamInterface;
  13. /**
  14.  * Class loading "@ParamInterface" annotations from methods.
  15.  *
  16.  * @author Alexander <iam.asm89@gmail.com>
  17.  * @author Lukas Kahwe Smith <smith@pooteeweet.org>
  18.  * @author Boris GuĂ©ry  <guery.b@gmail.com>
  19.  */
  20. final class ParamReader implements ParamReaderInterface
  21. {
  22.     /**
  23.      * @var Reader|null
  24.      */
  25.     private $annotationReader;
  26.     public function __construct(?Reader $annotationReader null)
  27.     {
  28.         $this->annotationReader $annotationReader;
  29.     }
  30.     /**
  31.      * {@inheritdoc}
  32.      */
  33.     public function read(\ReflectionClass $reflectionstring $method): array
  34.     {
  35.         if (!$reflection->hasMethod($method)) {
  36.             throw new \InvalidArgumentException(sprintf('Class "%s" has no method "%s".'$reflection->getName(), $method));
  37.         }
  38.         $methodParams $this->getParamsFromMethod($reflection->getMethod($method));
  39.         $classParams $this->getParamsFromClass($reflection);
  40.         return array_merge($methodParams$classParams);
  41.     }
  42.     /**
  43.      * {@inheritdoc}
  44.      */
  45.     public function getParamsFromMethod(\ReflectionMethod $method): array
  46.     {
  47.         $annotations = [];
  48.         if (\PHP_VERSION_ID >= 80000) {
  49.             $annotations $this->getParamsFromAttributes($method);
  50.         }
  51.         if (null !== $this->annotationReader) {
  52.             $annotations array_merge(
  53.                 $annotations,
  54.                 $this->annotationReader->getMethodAnnotations($method) ?? []
  55.             );
  56.         }
  57.         return $this->getParamsFromAnnotationArray($annotations);
  58.     }
  59.     /**
  60.      * {@inheritdoc}
  61.      */
  62.     public function getParamsFromClass(\ReflectionClass $class): array
  63.     {
  64.         $annotations = [];
  65.         if (\PHP_VERSION_ID >= 80000) {
  66.             $annotations $this->getParamsFromAttributes($class);
  67.         }
  68.         if (null !== $this->annotationReader) {
  69.             $annotations array_merge(
  70.                 $annotations,
  71.                 $this->annotationReader->getClassAnnotations($class) ?? []
  72.             );
  73.         }
  74.         return $this->getParamsFromAnnotationArray($annotations);
  75.     }
  76.     /**
  77.      * @return ParamInterface[]
  78.      */
  79.     private function getParamsFromAnnotationArray(array $annotations): array
  80.     {
  81.         $params = [];
  82.         foreach ($annotations as $annotation) {
  83.             if ($annotation instanceof ParamInterface) {
  84.                 $params[$annotation->getName()] = $annotation;
  85.             }
  86.         }
  87.         return $params;
  88.     }
  89.     /**
  90.      * @param \ReflectionClass|\ReflectionMethod $reflection
  91.      *
  92.      * @return ParamInterface[]
  93.      */
  94.     private function getParamsFromAttributes($reflection): array
  95.     {
  96.         $params = [];
  97.         foreach ($reflection->getAttributes(ParamInterface::class, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) {
  98.             $param $attribute->newInstance();
  99.             $params[$param->getName()] = $param;
  100.         }
  101.         return $params;
  102.     }
  103. }