Doctrine 2 получает реальное имя класса прокси - PullRequest
12 голосов
/ 06 октября 2010

Следующее:

У меня примерно 20 моделей.Эти классы расширяют базовый класс.Этот базовый класс содержит метод, который должен быть в состоянии определить имя класса дочернего элемента.Обычно это можно сделать с помощью:

get_called_class();

Но во многих случаях доктрина 2 использует ProxyClasses, и в этом случае функция get_called_class () возвращает что-то вроде:

Proxies\BasePageElementProxy

Хотя исходное имя\ Base \ PageElement.Может кто-нибудь сказать мне, как я могу узнать, как называется этот класс (без генерации имени из строки Proxies \ BaseSectionProxy причина, которая является грязной и во многих случаях ненадежной).

Ответы [ 2 ]

61 голосов
/ 15 февраля 2013

используйте класс Doctrine 'ClassUtils'

\Doctrine\Common\Util\ClassUtils::getRealClass(get_class($entity));
12 голосов
/ 06 октября 2010

Вы получите настоящее имя, позвонив по телефону:

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

Однако для этого требуется ссылка на EntityManager. Если вы используете статические методы поиска через свои классы сущностей, вы будете иметь к ним доступ в любом случае статически / глобально, например:

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);
    }
}
...