2012-02-03 13 views
15

ho il seguente codice:Get nome dell'entità da oggetto classe

namespace Acme\StoreBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Acme\StoreBundle\Entity\User 
* 
* @ORM\Table(name="users") 
* @ORM\Entity() 
*/ 
class User { 
... 
} 

$user = new User(); 

Qualcuno sa come posso ora ottenere il nome dell'entità (AcmeStoreBundle:User) dall'oggetto User?

risposta

44

Questo dovrebbe sempre funziona (non ritorno della classe Proxy):

$em = $this->container->get('doctrine')->getEntityManager(); 
$className = $em->getClassMetadata(get_class($object))->getName(); 

Come getClassMetadata è deprecato, è ora possibile utilizzare getMetadataFor

$entityName = $this->em->getMetadataFactory()->getMetadataFor(get_class($object))->getName(); 
+0

Fa il lavoro. Qualche vantaggio rispetto all'approccio di Wojciech? –

+0

Come sottolineato da @chopchop, i proxy come 'Proxies \ __ CG __ \ MyBundle \ Entity \ MyEntity' vengono gestiti correttamente. Questo è particolarmente importante se si prelevano le entrate da un database. –

+1

Questa è la soluzione corretta! –

9

PHP get_class() la funzione restituirà User e lo spazio dei nomi (vedere i commenti in documenti php).

+0

Anche se hai ragione, questo sarà anche me restituire la directory entità nel percorso namespace, quindi sì ho potuto togliere questo fuori, ma non sapevo se esistesse già una funzione disponibile in dottrina per ottenere questo valore previsto – Matt

+2

Stai attento a usare il metodo seno non funzionerà ogni volta. Doctrine usa un po 'di cache e genera una classe proxy. Se usi il metodo thins avrai qualcosa come "Proxy \ AcmeStoreBundleEntity \ Proxy" – Chopchop

+0

Vedi l'altra soluzione, get_class() può fallire perché a volte restituisce una classe Proxy. "$ em-> getClassMetadata (get_class ($ oggetto)) -> getName()" no. Questo gestisce correttamente le classi proxy. – benske

7

getClassMetadata() è deprecato e sarà rimosso in futuro. Utilizzare getMetadataFor() invece:

$entityName = $this->em->getMetadataFactory()->getMetadataFor(get_class($entity))->getName(); 

o una funzione completa:

/** 
* Returns Doctrine entity name 
* 
* @param mixed $entity 
* 
* @return string 
* @throws \Exception 
*/ 
private function getEntityName($entity) 
{ 
    try { 
     $entityName = $this->em->getMetadataFactory()->getMetadataFor(get_class($entity))->getName(); 
    } catch (MappingException $e) { 
     throw new \Exception('Given object ' . get_class($entity) . ' is not a Doctrine Entity. '); 
    } 

    return $entityName; 
} 
+0

Siamo spiacenti di rispondere a questa domanda, ma sto affrontando un problema più vicino a questo. Ho un repository di entità personalizzate che estende Doctrine. Nel mio repository personalizzato ho una funzione di conteggio che suppone di darmi un numero totale di record per qualsiasi entità su cui viene chiamato questo metodo. Quando faccio un print_r posso vedere cosa cerco ma non so come arrivarci. Il metodo "from" del mio QueryBuilder deve essere passato al nome dell'entità interrogata dinamicamente. Qualsiasi aiuto? – Maximum86