Doctrine 2 获取代理类的真实类名
Posted
技术标签:
【中文标题】Doctrine 2 获取代理类的真实类名【英文标题】:Doctrine 2 get real class name of proxy class 【发布时间】:2010-10-06 08:13:38 【问题描述】:以下内容:
我有大约 20 个模型。这些类扩展了一个基类。这个基类包含一个方法,该方法应该能够确定子元素的类名。通常你可以这样做:
get_called_class();
但在许多情况下,学说 2 使用 ProxyClasses,在这种情况下,get_call_class() 函数返回如下内容:
Proxies\BasePageElementProxy
虽然原始名称是 \Base\PageElement。谁能告诉我如何找出这个类的名称(不从字符串 Proxies\BaseSectionProxy 生成名称,因为它很脏,在许多情况下不可靠)。
【问题讨论】:
【参考方案1】:使用 Doctrine 类 'ClassUtils'
\Doctrine\Common\Util\ClassUtils::getRealClass(get_class($entity));
【讨论】:
如果你已经有了对象,就用getClass
:\Doctrine\Common\Util\ClassUtils::getClass($entity);
这已被弃用,看起来必须更换【参考方案2】:
你可以通过调用获得真实姓名:
$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);
【讨论】:
非常感谢!奇迹般有效。就教义而言,您似乎正在成为我的私人老师! +1\Doctrine\Common\Util\ClassUtils::getClass($entity);
是更好的解决方案,因为最好不要让实体知道经理。以上是关于Doctrine 2 获取代理类的真实类名的主要内容,如果未能解决你的问题,请参考以下文章