vendor/api-platform/core/src/Annotation/AttributesHydratorTrait.php line 75

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the API Platform project.
  4.  *
  5.  * (c) Kévin Dunglas <dunglas@gmail.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. declare(strict_types=1);
  11. namespace ApiPlatform\Core\Annotation;
  12. use ApiPlatform\Core\Exception\InvalidArgumentException;
  13. use ApiPlatform\Core\Util\Inflector;
  14. /**
  15.  * Hydrates attributes from annotation's parameters.
  16.  *
  17.  * @internal
  18.  *
  19.  * @author Baptiste Meyer <baptiste.meyer@gmail.com>
  20.  * @author Kévin Dunglas <dunglas@gmail.com>
  21.  */
  22. trait AttributesHydratorTrait
  23. {
  24.     private static $configMetadata;
  25.     /**
  26.      * @internal
  27.      */
  28.     public static function getConfigMetadata(): array
  29.     {
  30.         if (null !== self::$configMetadata) {
  31.             return self::$configMetadata;
  32.         }
  33.         $rc = new \ReflectionClass(self::class);
  34.         $publicProperties = [];
  35.         foreach ($rc->getProperties(\ReflectionProperty::IS_PUBLIC) as $reflectionProperty) {
  36.             $publicProperties[$reflectionProperty->getName()] = true;
  37.         }
  38.         $configurableAttributes = [];
  39.         foreach ($rc->getConstructor()->getParameters() as $param) {
  40.             if (!isset($publicProperties[$name $param->getName()])) {
  41.                 $configurableAttributes[$name] = true;
  42.             }
  43.         }
  44.         return [$publicProperties$configurableAttributes];
  45.     }
  46.     /**
  47.      * @var array
  48.      */
  49.     public $attributes null;
  50.     /**
  51.      * @throws InvalidArgumentException
  52.      */
  53.     private function hydrateAttributes(array $values): void
  54.     {
  55.         if (isset($values['attributes'])) {
  56.             $this->attributes $values['attributes'];
  57.             unset($values['attributes']);
  58.         }
  59.         foreach (self::$deprecatedAttributes as $deprecatedAttribute => $options) {
  60.             if (\array_key_exists($deprecatedAttribute$values)) {
  61.                 $values[$options[0]] = $values[$deprecatedAttribute];
  62.                 @trigger_error(sprintf('Attribute "%s" is deprecated in annotation since API Platform %s, prefer using "%s" attribute instead'$deprecatedAttribute$options[1], $options[0]), \E_USER_DEPRECATED);
  63.                 unset($values[$deprecatedAttribute]);
  64.             }
  65.         }
  66.         [$publicProperties$configurableAttributes] = self::getConfigMetadata();
  67.         foreach ($values as $key => $value) {
  68.             $key = (string) $key;
  69.             if (!isset($publicProperties[$key]) && !isset($configurableAttributes[$key]) && !isset(self::$deprecatedAttributes[$key])) {
  70.                 throw new InvalidArgumentException(sprintf('Unknown property "%s" on annotation "%s".'$keyself::class));
  71.             }
  72.             if (isset($publicProperties[$key])) {
  73.                 $this->{$key} = $value;
  74.                 continue;
  75.             }
  76.             if (!\is_array($this->attributes)) {
  77.                 $this->attributes = [];
  78.             }
  79.             $this->attributes += [Inflector::tableize($key) => $value];
  80.         }
  81.     }
  82. }