Doctrine 2获取代理类的真正类名

Ren*_*gen 12 php orm doctrine-orm

下列:

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

get_called_class();
Run Code Online (Sandbox Code Playgroud)

但在许多情况下,doctrine 2使用ProxyClasses,在这种情况下,get_called_class()函数返回类似于:

Proxies\BasePageElementProxy
Run Code Online (Sandbox Code Playgroud)

而原始名称是\ Base\PageElement.任何人都可以告诉我如何找出这个类的名称是什么(没有生成字符串Proxies\BaseSectionProxy的名称,因为它是脏的,在许多情况下是不可靠的).

小智 61

使用Doctrine类'ClassUtils'

\Doctrine\Common\Util\ClassUtils::getRealClass(get_class($entity));
Run Code Online (Sandbox Code Playgroud)

  • 如果你已经有了一个对象,只需使用`getClass`:`\ Doctrine\Common\Util\ClassUtils :: getClass($ entity);` (23认同)
  • 这已被弃用,看起来必须更换 (3认同)

beb*_*lei 12

通过调用获得真实姓名:

$em->getClassMetadata(get_called_class())->name;
Run Code Online (Sandbox Code Playgroud)

但是,这需要引用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `\Doctrine\Common\Util\ClassUtils::getClass($entity);` 是更好的解决方案,因为最佳实践是不让实体知道管理器。 (2认同)