Doctrine 2 получает настоящее имя класса прокси-класса

Следующее:

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

get_called_class();

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

Proxies\BasePageElementProxy

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

Ответ 1

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

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

Ответ 2

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

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