【问题标题】:Doctrine 2 get real class name of proxy classDoctrine 2 获取代理类的真实类名
【发布时间】:2010-10-06 08:13:38
【问题描述】:

以下内容:

我有大约 20 个模型。这些类扩展了一个基类。这个基类包含一个方法,该方法应该能够确定子元素的类名。通常你可以这样做:

get_called_class();

但在许多情况下,学说 2 使用 ProxyClasses,在这种情况下,get_call_class() 函数返回如下内容:

Proxies\BasePageElementProxy

虽然原始名称是 \Base\PageElement。谁能告诉我如何找出这个类的名称(不从字符串 Proxies\BaseSectionProxy 生成名称,因为它很脏,在许多情况下不可靠)。

【问题讨论】:

    标签: php orm doctrine-orm


    【解决方案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); 是更好的解决方案,因为最好不要让实体知道经理。
    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多