简体   繁体   中英

PHP find variable type from property through annotation

I'm developing a web application with Symfony 3 from an existing project for over 8 years. Therefore I inherit an existing model.

Some entities have this field

/**
 * @var integer
 *
 * @ORM\Column(name="FourID_Site", type="bigint", nullable=true)
 */
private $fouridSite;

And some other have

/**
 * @var \FourListe
 *
 * @ORM\ManyToOne(targetEntity="FourListe")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="FourID_Site", referencedColumnName="FourID")
 * })
 */
private $fouridSite;

I have a method which is called before all persist and flush doctrine method for update automatically some fields.

    if (property_exists(get_class($entity), 'fouridSite')) {
        $entity->setFouridSite($this->current_user->getFouridSiteutilisateur());
    }
    if (property_exists(get_class($entity), 'majlogin')) {
        $entity->setMajlogin($this->current_user->getLogin());
    }
    if (property_exists(get_class($entity), 'majdate')) {
        $entity->setMajdate(new \DateTime());
    }

Issue : This code throw an error when $fouridSite is an integer because I can't assign an entity ( $this->current_user->getFouridSiteutilisateur() return a FourListe entity) when doctrine want an integer. And it is normal.

The native php method get type() can't be used in this case because it return NULL.

https://php.net/gettype

So, there is a way maybe, through annotation, to know if $fourisSite will be an entity or an integer ?

Thanks for ideas or potentials any suggestions?

Depending on where your update hook is located, you can use this to know the type of your column:

$em = $this->get('doctrine')->getManager();
$metadata = $em->getClassMetadata(get_class($entity));
$fieldMetadata = $metadata->fieldMappings['fouridSite'];

// Catch the type
$fieldType = $fieldMetadata['type'];

Then add some checks on this type to register the good value.
Hope you can access the doctrine service from your method.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM