vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Mapping/Driver/AttributeReader.php line 24

  1. <?php
  2. declare(strict_types=1);
  3. namespace Doctrine\ODM\MongoDB\Mapping\Driver;
  4. use Doctrine\Common\Annotations\Reader;
  5. use Doctrine\ODM\MongoDB\Mapping\Annotations\Annotation;
  6. use ReflectionAttribute;
  7. use ReflectionClass;
  8. use ReflectionMethod;
  9. use ReflectionProperty;
  10. use function assert;
  11. use function is_subclass_of;
  12. /**
  13.  * @internal
  14.  */
  15. final class AttributeReader implements Reader
  16. {
  17.     public function getClassAnnotations(ReflectionClass $class): array
  18.     {
  19.         return $this->convertToAttributeInstances($class->getAttributes());
  20.     }
  21.     /**
  22.      * @param class-string<T> $annotationName
  23.      *
  24.      * @return T|null
  25.      *
  26.      * @template T
  27.      */
  28.     public function getClassAnnotation(ReflectionClass $class$annotationName)
  29.     {
  30.         foreach ($this->getClassAnnotations($class) as $annotation) {
  31.             if ($annotation instanceof $annotationName) {
  32.                 return $annotation;
  33.             }
  34.         }
  35.         return null;
  36.     }
  37.     public function getMethodAnnotations(ReflectionMethod $method): array
  38.     {
  39.         return $this->convertToAttributeInstances($method->getAttributes());
  40.     }
  41.     /**
  42.      * @param class-string<T> $annotationName
  43.      *
  44.      * @return T|null
  45.      *
  46.      * @template T
  47.      */
  48.     public function getMethodAnnotation(ReflectionMethod $method$annotationName)
  49.     {
  50.         foreach ($this->getMethodAnnotations($method) as $annotation) {
  51.             if ($annotation instanceof $annotationName) {
  52.                 return $annotation;
  53.             }
  54.         }
  55.         return null;
  56.     }
  57.     public function getPropertyAnnotations(ReflectionProperty $property): array
  58.     {
  59.         return $this->convertToAttributeInstances($property->getAttributes());
  60.     }
  61.     /**
  62.      * @param class-string<T> $annotationName
  63.      *
  64.      * @return T|null
  65.      *
  66.      * @template T
  67.      */
  68.     public function getPropertyAnnotation(ReflectionProperty $property$annotationName)
  69.     {
  70.         foreach ($this->getPropertyAnnotations($property) as $annotation) {
  71.             if ($annotation instanceof $annotationName) {
  72.                 return $annotation;
  73.             }
  74.         }
  75.         return null;
  76.     }
  77.     /**
  78.      * @param ReflectionAttribute<object>[] $attributes
  79.      *
  80.      * @return Annotation[]
  81.      */
  82.     private function convertToAttributeInstances(array $attributes): array
  83.     {
  84.         $instances = [];
  85.         foreach ($attributes as $attribute) {
  86.             $attributeName $attribute->getName();
  87.             // Make sure we only get Doctrine Annotations
  88.             if (! is_subclass_of($attributeNameAnnotation::class)) {
  89.                 continue;
  90.             }
  91.             $instance $attribute->newInstance();
  92.             assert($instance instanceof Annotation);
  93.             $instances[] = $instance;
  94.         }
  95.         return $instances;
  96.     }
  97. }