<?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Symfony\Bridge\Doctrine\Form\ChoiceList;use Doctrine\Persistence\Mapping\ClassMetadata;use Doctrine\Persistence\ObjectManager;use Symfony\Component\Form\Exception\RuntimeException;/** * A utility for reading object IDs. * * @author Bernhard Schussek <bschussek@gmail.com> * * @internal */class IdReader{    private $om;    private $classMetadata;    private $singleId;    private $intId;    private $idField;    /**     * @var IdReader|null     */    private $associationIdReader;    public function __construct(ObjectManager $om, ClassMetadata $classMetadata)    {        $ids = $classMetadata->getIdentifierFieldNames();        $idType = $classMetadata->getTypeOfField(current($ids));        $this->om = $om;        $this->classMetadata = $classMetadata;        $this->singleId = 1 === \count($ids);        $this->intId = $this->singleId && \in_array($idType, ['integer', 'smallint', 'bigint']);        $this->idField = current($ids);        // single field association are resolved, since the schema column could be an int        if ($this->singleId && $classMetadata->hasAssociation($this->idField)) {            $this->associationIdReader = new self($om, $om->getClassMetadata(                $classMetadata->getAssociationTargetClass($this->idField)            ));            $this->singleId = $this->associationIdReader->isSingleId();            $this->intId = $this->associationIdReader->isIntId();        }    }    /**     * Returns whether the class has a single-column ID.     */    public function isSingleId(): bool    {        return $this->singleId;    }    /**     * Returns whether the class has a single-column integer ID.     */    public function isIntId(): bool    {        return $this->intId;    }    /**     * Returns the ID value for an object.     *     * This method assumes that the object has a single-column ID.     */    public function getIdValue(object $object = null): string    {        if (!$object) {            return '';        }        if (!$this->om->contains($object)) {            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)));        }        $this->om->initializeObject($object);        $idValue = current($this->classMetadata->getIdentifierValues($object));        if ($this->associationIdReader) {            $idValue = $this->associationIdReader->getIdValue($idValue);        }        return (string) $idValue;    }    /**     * Returns the name of the ID field.     *     * This method assumes that the object has a single-column ID.     */    public function getIdField(): string    {        return $this->idField;    }}