2010-10-06 9 views
11

la siguiente:Doctrina 2 Obtener el nombre de clase real de la clase proxy

tengo approximantely 20 modelos. Estas clases extienden una clase base. Esta clase base contiene un método que debería poder determinar el nombre de clase del elemento hijo. Normalmente, usted podría esto con:

get_called_class(); 

Pero en muchos casos la doctrina 2 utiliza ProxyClasses y en ese caso la función get_called_class() devuelve algo como:

Proxies\BasePageElementProxy 

Mientras que el nombre original es \ Base \ PageElement . ¿Alguien puede decirme cómo puedo averiguar cuál es el nombre de esta clase (sin generar el nombre de la cadena Proxies \ BaseSectionProxy causa que está sucio y en muchos casos no es confiable).

Respuesta

11

obtener el nombre real, llamando al:

$em->getClassMetadata(get_called_class())->name; 

Sin embargo, esto requiere una referencia a la EntityManager. Si usted está haciendo métodos de búsqueda estáticos a través de sus clases de entidad que tendrá acceso a esa forma estática/global de todos modos, aunque, por ejemplo:

abstract class Record 
{ 
    private static $em = null; 

    static public function setEntityManager($em) 
    { 
     self::$em = $em; 
    } 

    static public function __callStatic($method, $args) 
    { 
     $className = self::$em->getClassMetadata(get_called_class())->name; 
     return call_user_func_array(array(self::$em->getRepository($className), $method), $args); 
    } 
} 
+1

Muchas gracias ! Funciona de maravilla. ¡Parece que te estás convirtiendo en mi profesor personal cuando se trata de Doctrine! +1 –

55

utilizar la clase Doctrina 'ClassUtils'

\Doctrine\Common\Util\ClassUtils::getRealClass(get_class($entity)); 
+19

Si ya tiene un objeto, simplemente use 'getClass':' \ Doctrine \ Common \ Util \ ClassUtils :: getClass ($ entity); ' – Nate

Cuestiones relacionadas