Doctrine ORM Entity类名返回一个Proxy类名

时间:2013-03-18 11:54:15

标签: doctrine-orm proxy-classes

我目前正在检索我的实体的类名,以将更改保存到日志中。这发生在听众身上:

在我的服务层:

$product = $line->getProduct();

$product->setAvailability($product->getAvailability() - $line->getAmount());
$em->persist($product);

问题在于通过在监听器中执行以下操作:

$className = join('', array_slice(explode('\\', get_class($entity)), -1));
$modification->setEntidad($className);

修改中设置的$classNamemiomioBundleEntityProductoProxy

如何获取实体的真实类名,而不是代理类名?

2 个答案:

答案 0 :(得分:1)

由于代理类总是从真实实体类扩展而来:

class <proxyShortClassName> extends \<className> implements \<baseProxyInterface>

然后,您可以使用class_parents()函数获取它:

if ($entity instanceof \Doctrine\Common\Proxy\Proxy) {
    $class = current(class_parents($entity)); // get real class
}

如果您无法访问EntityManager个实例,则非常有用。

答案 1 :(得分:0)

在代理上调用get_class时收到代理名称的事实很正常,因为代理是让ORM和延迟加载关联工作的必需概念。

您可以使用以下API获取原始类名:

$realClassName = $entityManager->getClassMetadata(get_class($object))->getName();

然后您可以应用自己的转换:

$normalizedClassName = join('', array_slice(explode('\\', $realClassName), -1));

$modificacion->setEntidad($normalizedClassName);