2012-02-03 19 views
15

tengo el siguiente código:Obtener nombre de la entidad de la clase Object

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(); 

¿Alguien sabe cómo puedo ahora conseguir el nombre de la entidad (AcmeStoreBundle:User) del objeto User?

Respuesta

44

Esto siempre debe trabajar (no retorno de la clase Proxy):

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

Como getClassMetadata es obsoleto, ahora se puede utilizar getMetadataFor

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

Hace el trabajo. ¿Alguna ventaja en comparación con el enfoque de Wojciech? –

+0

Como señaló @chopchop, los proxies como 'Proxies \ __ CG __ \ MyBundle \ Entity \ MyEntity' se manejan correctamente. Esto es especialmente importante si obtiene entidades de una base de datos. –

+1

¡Esta es la solución correcta! –

9

PHP get_class() función devolverá User y espacio de nombres (ver comentarios en php docs).

+0

A pesar de que tiene razón, esto también me devuelven el directorio de la entidad en el camino de espacio de nombres, por lo que sí que podría despojar a esto, pero no sabía si ya había una función disponible en la doctrina para obtener este valor previsto – Matt

+2

Tenga cuidado con el método ya que no funcionará cada vez. Doctrine usa algo de caché y generará una clase de proxy. Si usa el método thin, tendrá algo así como "Proxy \ AcmeStoreBundleEntity \ Proxy" – Chopchop

+0

Vea la otra solución, get_class() puede fallar porque a veces devuelve una clase Proxy. "$ em-> getClassMetadata (get_class ($ object)) -> getName()" no. Esto maneja las clases de proxy correctamente. – benske

7

getClassMetadata() es obsoleto y será eliminado en el futuro. Utilice getMetadataFor() en su lugar:

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

o una función 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

Perdón por dar un salto en esta pregunta, pero estoy enfrentando un problema más cercano a esto. Tengo un repositorio de entidades personalizado que amplía Doctrine's. En mi repositorio personalizado tengo una función de recuento que se supone que debe darme un número total de registros para cualquier entidad en la que se invoque este método. Cuando hago print_r puedo ver lo que estoy buscando pero no sé cómo llegar a él. El método "de" de mi QueryBuilder necesita pasar el nombre de la entidad que se consulta dinámicamente. ¿Alguna ayuda? – Maximum86

Cuestiones relacionadas