Доктрина 2 Получить настоящее имя класса класса прокси
-
28-09-2019 - |
Вопрос
Последующий:
У меня есть приблизительно 20 моделей. Эти классы расширяют базовый класс. Этот базовый класс содержит метод, который должен иметь возможность определять классное значение элемента ребенка. Обычно вы можете это с:
get_called_class();
Но во многих случаях доктрина 2 использует ProxyClasses, и в этом случае функция get_called_class () возвращает что-то вроде:
Proxies\BasePageElementProxy
Хотя исходное имя base statelement. Кто-нибудь может сказать мне, как я могу узнать, что название этого класса (без генерации названия из строковых прокси baseSectionProxy причина, что грязно и во многих случаях ненадежна).
Решение
Вы получаете настоящее имя, позвонив:
$em->getClassMetadata(get_called_class())->name;
Однако это требует ссылки на EntiteManager. Если вы занимаетесь статическими методами поиска по классам сущности, у вас все равно будет доступ к этому статически / глобально, например, например:
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);
}
}
Другие советы
использовать уклон класса «Classutils»
\Doctrine\Common\Util\ClassUtils::getRealClass(get_class($entity));