vendor/symfony/doctrine-bridge/Form/ChoiceList/IdReader.php line 77

  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.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 Symfony\Bridge\Doctrine\Form\ChoiceList;
  11. use Doctrine\Persistence\Mapping\ClassMetadata;
  12. use Doctrine\Persistence\ObjectManager;
  13. use Symfony\Component\Form\Exception\RuntimeException;
  14. /**
  15.  * A utility for reading object IDs.
  16.  *
  17.  * @author Bernhard Schussek <bschussek@gmail.com>
  18.  *
  19.  * @internal
  20.  */
  21. class IdReader
  22. {
  23.     private ObjectManager $om;
  24.     private ClassMetadata $classMetadata;
  25.     private bool $singleId;
  26.     private bool $intId;
  27.     private string $idField;
  28.     private ?self $associationIdReader null;
  29.     public function __construct(ObjectManager $omClassMetadata $classMetadata)
  30.     {
  31.         $ids $classMetadata->getIdentifierFieldNames();
  32.         $idType $classMetadata->getTypeOfField(current($ids));
  33.         $this->om $om;
  34.         $this->classMetadata $classMetadata;
  35.         $this->singleId === \count($ids);
  36.         $this->intId $this->singleId && \in_array($idType, ['integer''smallint''bigint']);
  37.         $this->idField current($ids);
  38.         // single field association are resolved, since the schema column could be an int
  39.         if ($this->singleId && $classMetadata->hasAssociation($this->idField)) {
  40.             $this->associationIdReader = new self($om$om->getClassMetadata(
  41.                 $classMetadata->getAssociationTargetClass($this->idField)
  42.             ));
  43.             $this->singleId $this->associationIdReader->isSingleId();
  44.             $this->intId $this->associationIdReader->isIntId();
  45.         }
  46.     }
  47.     /**
  48.      * Returns whether the class has a single-column ID.
  49.      */
  50.     public function isSingleId(): bool
  51.     {
  52.         return $this->singleId;
  53.     }
  54.     /**
  55.      * Returns whether the class has a single-column integer ID.
  56.      */
  57.     public function isIntId(): bool
  58.     {
  59.         return $this->intId;
  60.     }
  61.     /**
  62.      * Returns the ID value for an object.
  63.      *
  64.      * This method assumes that the object has a single-column ID.
  65.      */
  66.     public function getIdValue(object $object null): string
  67.     {
  68.         if (!$object) {
  69.             return '';
  70.         }
  71.         if (!$this->om->contains($object)) {
  72.             throw new RuntimeException(sprintf('Entity of type "%s" passed to the choice field must be managed. Maybe you forget to persist it in the entity manager?'get_debug_type($object)));
  73.         }
  74.         $this->om->initializeObject($object);
  75.         $idValue current($this->classMetadata->getIdentifierValues($object));
  76.         if ($this->associationIdReader) {
  77.             $idValue $this->associationIdReader->getIdValue($idValue);
  78.         }
  79.         return (string) $idValue;
  80.     }
  81.     /**
  82.      * Returns the name of the ID field.
  83.      *
  84.      * This method assumes that the object has a single-column ID.
  85.      */
  86.     public function getIdField(): string
  87.     {
  88.         return $this->idField;
  89.     }
  90. }