2013-03-18 5 views
3

현재 엔티티의 클래스 이름을 검색하여 변경 사항을 로그에 저장합니다. 내 서비스 계층에서Doctrine ORM 엔티티 클래스 이름이 Proxy 클래스 이름을 반환합니다.

:이 리스너에서 발생

$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입니다.

프록시 클래스 이름이 아닌 내 엔티티의 실제 클래스 이름을 어떻게 가져올 수 있습니까?

+0

나는 당신의 문제가 무엇인지 또는 귀하의 질문이 무엇인지에 대해 전혀 알지 못합니다. 이해할 수 있도록 질문을 수정하십시오. – Sgoettschkes

+0

@Sgoettschkes 질문을 다시 작성했습니다. – Ocramius

답변

0

프록시에서 get_class을 호출 할 때 프록시 이름을 수신한다는 사실은 프록시가 ORM과 연결의 지연로드를 허용하는 데 필요한 개념이기 때문에 매우 정상입니다.

당신은 다음과 같은 API를 사용하여 원래의 클래스 이름을 얻을 수 있습니다 : 프록시 클래스는 항상 실제 기업에서 확장으로

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

$modificacion->setEntidad($normalizedClassName); 
+1

ClassUtils :: getRealClass ($ className)를 사용하는 것이 더 빠릅니다. – kipelovets

+0

모든 경우에 클래스 이름을 검색하지 않습니다. 구현 세부 사항이므로 수동으로해서는 안됩니다. – Ocramius

1

:

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

그런 다음 자신의 변환을 적용 할 수 있습니다 수업 :

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

다음, 당신이 class_parents() 기능을 얻을 수 있습니다 :

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

당신이 EntityManager 인스턴스에 액세스 할 수없는 경우에 특히 유용합니다.