2010-10-06 9 views
11

Il seguente:Doctrine 2 ottiene il nome di classe reale della classe proxy

Ho approssimativamente 20 modelli. Queste classi estendono una classe base. Questa classe base contiene un metodo che dovrebbe essere in grado di determinare il nome della classe dell'elemento figlio. Normalmente si potrebbe questo con:

get_called_class(); 

Ma in molti casi dottrina 2 utilizza ProxyClasses e in tal caso la funzione get_called_class() restituisce qualcosa come:

Proxies\BasePageElementProxy 

Mentre il nome originale è \ Base \ PageElement . Qualcuno può dirmi come posso scoprire qual è il nome di questa classe (senza generare il nome dalla stringa Proxies \ BaseSectionProxy che è sporca e in molti casi inaffidabile).

risposta

11

si ottiene il vero nome chiamando:

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

Ciò richiede tuttavia un riferimento al EntityManager. Se stai facendo i metodi finder statici attraverso le classi di entità si avrà accesso a quel modo statico/globalmente in ogni modo, però, per esempio:

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

ringrazio molto ! Funziona come un fascino. Sembra che tu stia diventando il mio insegnante personale quando si tratta di Doctrine! +1 –

55

utilizzare la classe Dottrina 'ClassUtils'

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

Se si dispone già di un oggetto, basta usare 'getClass':' \ Doctrine \ Common \ Util \ ClassUtils :: getClass ($ entity); ' – Nate