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