我目前正在检索我的实体的类名,以将更改保存到日志中。这发生在听众身上:
在我的服务层:
$product = $line->getProduct();
$product->setAvailability($product->getAvailability() - $line->getAmount());
$em->persist($product);
问题在于通过在监听器中执行以下操作:
$className = join('', array_slice(explode('\\', get_class($entity)), -1));
$modification->setEntidad($className);
修改中设置的$className
为miomioBundleEntityProductoProxy
。
如何获取实体的真实类名,而不是代理类名?
答案 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);