src/Core/Framework/DataAbstractionLayer/Entity.php line 55

  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Framework\DataAbstractionLayer;
  3. use Shopware\Core\Framework\DataAbstractionLayer\Exception\InternalFieldAccessNotAllowedException;
  4. use Shopware\Core\Framework\Log\Package;
  5. use Shopware\Core\Framework\Struct\ArrayEntity;
  6. use Shopware\Core\Framework\Struct\ArrayStruct;
  7. use Shopware\Core\Framework\Struct\Struct;
  8. #[Package('core')]
  9. class Entity extends Struct
  10. {
  11.     /**
  12.      * @var string
  13.      */
  14.     protected $_uniqueIdentifier;
  15.     /**
  16.      * @var string|null
  17.      */
  18.     protected $versionId;
  19.     /**
  20.      * @var array
  21.      */
  22.     protected $translated = [];
  23.     /**
  24.      * @var \DateTimeInterface|null
  25.      */
  26.     protected $createdAt;
  27.     /**
  28.      * @var \DateTimeInterface|null
  29.      */
  30.     protected $updatedAt;
  31.     /**
  32.      * @var string
  33.      */
  34.     private $_entityName;
  35.     private ?FieldVisibility $_fieldVisibility null;
  36.     public function __get($name)
  37.     {
  38.         if (FieldVisibility::$isInTwigRenderingContext) {
  39.             $this->checkIfPropertyAccessIsAllowed($name);
  40.         }
  41.         return $this->$name;
  42.     }
  43.     public function __set($name$value): void
  44.     {
  45.         $this->$name $value;
  46.     }
  47.     public function __isset($name)
  48.     {
  49.         if (FieldVisibility::$isInTwigRenderingContext) {
  50.             if (!$this->isPropertyVisible($name)) {
  51.                 return false;
  52.             }
  53.         }
  54.         return isset($this->$name);
  55.     }
  56.     public function setUniqueIdentifier(string $identifier): void
  57.     {
  58.         $this->_uniqueIdentifier $identifier;
  59.     }
  60.     public function getUniqueIdentifier(): string
  61.     {
  62.         return $this->_uniqueIdentifier;
  63.     }
  64.     public function getVersionId(): ?string
  65.     {
  66.         return $this->versionId;
  67.     }
  68.     public function setVersionId(string $versionId): void
  69.     {
  70.         $this->versionId $versionId;
  71.     }
  72.     /**
  73.      * @return mixed|Struct|null
  74.      */
  75.     public function get(string $property)
  76.     {
  77.         if (FieldVisibility::$isInTwigRenderingContext) {
  78.             $this->checkIfPropertyAccessIsAllowed($property);
  79.         }
  80.         if ($this->has($property)) {
  81.             return $this->$property;
  82.         }
  83.         if ($this->hasExtension($property)) {
  84.             return $this->getExtension($property);
  85.         }
  86.         /** @var ArrayStruct<string, mixed>|null $extension */
  87.         $extension $this->getExtension('foreignKeys');
  88.         if ($extension && $extension instanceof ArrayStruct && $extension->has($property)) {
  89.             return $extension->get($property);
  90.         }
  91.         throw new \InvalidArgumentException(
  92.             sprintf('Property %s do not exist in class %s'$property, static::class)
  93.         );
  94.     }
  95.     public function has(string $property): bool
  96.     {
  97.         if (FieldVisibility::$isInTwigRenderingContext) {
  98.             if (!$this->isPropertyVisible($property)) {
  99.                 return false;
  100.             }
  101.         }
  102.         return property_exists($this$property);
  103.     }
  104.     public function getTranslated(): array
  105.     {
  106.         return $this->translated;
  107.     }
  108.     /**
  109.      * @return mixed|null
  110.      */
  111.     public function getTranslation(string $field)
  112.     {
  113.         return $this->translated[$field] ?? null;
  114.     }
  115.     public function setTranslated(array $translated): void
  116.     {
  117.         $this->translated $translated;
  118.     }
  119.     public function addTranslated(string $keymixed $value): void
  120.     {
  121.         $this->translated[$key] = $value;
  122.     }
  123.     public function getCreatedAt(): ?\DateTimeInterface
  124.     {
  125.         return $this->createdAt;
  126.     }
  127.     public function setCreatedAt(\DateTimeInterface $createdAt): void
  128.     {
  129.         $this->createdAt $createdAt;
  130.     }
  131.     public function getUpdatedAt(): ?\DateTimeInterface
  132.     {
  133.         return $this->updatedAt;
  134.     }
  135.     public function setUpdatedAt(\DateTimeInterface $updatedAt): void
  136.     {
  137.         $this->updatedAt $updatedAt;
  138.     }
  139.     /**
  140.      * @return array<mixed>
  141.      */
  142.     public function jsonSerialize(): array
  143.     {
  144.         $data parent::jsonSerialize();
  145.         unset($data['_entityName']);
  146.         unset($data['_fieldVisibility']);
  147.         $data $this->filterInvisibleFields($data);
  148.         if (!$this->hasExtension('foreignKeys')) {
  149.             return $data;
  150.         }
  151.         $extension $this->getExtension('foreignKeys');
  152.         if (!$extension instanceof ArrayEntity) {
  153.             return $data;
  154.         }
  155.         foreach ($extension->all() as $key => $value) {
  156.             if (\array_key_exists($key$data)) {
  157.                 continue;
  158.             }
  159.             $data[$key] = $value;
  160.         }
  161.         return $data;
  162.     }
  163.     public function getVars(): array
  164.     {
  165.         $data parent::getVars();
  166.         return $this->filterInvisibleFields($data);
  167.     }
  168.     public function getApiAlias(): string
  169.     {
  170.         if ($this->_entityName !== null) {
  171.             return $this->_entityName;
  172.         }
  173.         $class = static::class;
  174.         $class explode('\\'$class);
  175.         $class end($class);
  176.         /** @var string $entityName */
  177.         $entityName preg_replace(
  178.             '/_entity$/',
  179.             '',
  180.             ltrim(mb_strtolower((string) preg_replace('/[A-Z]/''_$0'$class)), '_')
  181.         );
  182.         $this->_entityName $entityName;
  183.         return $entityName;
  184.     }
  185.     /**
  186.      * @internal
  187.      */
  188.     public function internalSetEntityData(string $entityNameFieldVisibility $fieldVisibility): self
  189.     {
  190.         $this->_entityName $entityName;
  191.         $this->_fieldVisibility $fieldVisibility;
  192.         return $this;
  193.     }
  194.     /**
  195.      * @internal
  196.      */
  197.     public function getInternalEntityName(): ?string
  198.     {
  199.         return $this->_entityName;
  200.     }
  201.     /**
  202.      * @internal
  203.      */
  204.     protected function filterInvisibleFields(array $data): array
  205.     {
  206.         if (!$this->_fieldVisibility) {
  207.             return $data;
  208.         }
  209.         return $this->_fieldVisibility->filterInvisible($data);
  210.     }
  211.     /**
  212.      * @internal
  213.      */
  214.     protected function checkIfPropertyAccessIsAllowed(string $property): void
  215.     {
  216.         if (!$this->isPropertyVisible($property)) {
  217.             throw new InternalFieldAccessNotAllowedException($property$this);
  218.         }
  219.     }
  220.     /**
  221.      * @internal
  222.      */
  223.     protected function isPropertyVisible(string $property): bool
  224.     {
  225.         if (!$this->_fieldVisibility) {
  226.             return true;
  227.         }
  228.         return $this->_fieldVisibility->isVisible($property);
  229.     }
  230. }