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 获取代理类的真实类名的主要内容,如果未能解决你的问题,请参考以下文章

从doctrine2中的代理对象获取“true”对象

对Java代理模式的理解

使用 insert() 方法通过 PHP Doctrine\DBAL 2 插入 DateTime 值

Java基础之反射注解代理

使用Jdk实现动态代理

反射和代理