2017-02-08 2 views
0

현재 버전의 Symfony (3.2.3)와 Doctrine ORM (2.5.6)을 사용하고 있으며, 여전히 getEntityManager()과 관련 메소드 의 비추천을 처리하는 방법에 대해 고민하고 있습니다.. 예를 들어Symfony 3에서 EntityManager를 올바르게 얻는 방법은 무엇입니까?

이 쿼리 빌더 인스턴스를 만들 수있는 방법이라고 현재 documentation 상태 :

$repository = $this->getDoctrine()->getRepository('AppBundle:Product'); 
$queryBuilder = $repository->createQueryBuilder('p') 

하지만 내가 (내 IDE가 동의하는 것)을 참조하는 방법을, getRepository()는에 암시 유형 ObjectRepository의 인스턴스를 반환하고 createQueryBuilder() 메서드는 해당 인터페이스에서 구현 클래스 EntityRepository으로 선언되지 않았습니다.

타 예는 컨트롤러에서 트랜잭션을 시작하는 명시 적으로 다음과 같습니다

$this->getDoctrine()->getEntityManager()->getConnection()->beginTransaction() 

가 나는 후자의 방법이 사용되지 않기 때문에 getManager() 대신 getEntityManager() 전화를 가정하고있다. 그러나 getManager()ObjectManager의 인스턴스를 반환하기 위해 힌트가 지정되며 getConnection()을 선언하지 않습니다.

PHP가 PHP 인 경우 코드가 여전히 모든 경우에 작동하는 것처럼 보이지만 IDE와 필자는 불안한 느낌을 갖습니다. 그렇다면 은 정확히이며 쿼리 작성기를 만들거나 Symfony 3에서 트랜잭션을 시작하는 방법은 무엇입니까? 내가 놓친 게 있니?

답변

1

Doctrine에는 RDBMS의 경우 ORM과 문서 지향적 인 DB의 경우 대부분 (MongoDB의 경우) ODM의 두 가지 유형의 데이터 맵퍼가 있습니다. 데이터 맵퍼는 일종의 지속성 (무지)을 달성하려고 시도하며 둘 다 ObjectManager 또는 ObjectRepository과 같이 Doctrine\Common에 정의 된 일반 인터페이스를 구현합니다.

symfony에서 getDoctrine() 메서드는 (기본값)에서 Registry 클래스의 인스턴스를 반환합니다. 즉,이 서비스는 사용 가능한 모든 연결과 엔티티 관리자를 보유합니다. 그의 방법 getManager()Doctrine\Common에서 구현되었지만 어떤 유형의 데이터 매퍼인지 알 수없고 반환 유형을 일반 ObjectManager으로 선언합니다.

IDE 경고를 피하려면 명시 적으로 인라인 PHPDoc을 정의 할 수 있습니다. Netbeans 및 PHPStorm이이를 지원합니다.그래서 type downcasting의 일종이며, 위의 방법으로

public function getEntityManager(): EntityManager 
{ 
    return $this->getDoctrine()->getManager(); 
} 

우리가 서비스를 요청 가정 ORM에서 실제로 : 실제 클래스가 확인됩니다

/* @var $entityManager Doctrine\ORM\EntityManager */ 
$entityManager = $this->getDoctrine()->getManager(); 

다른 솔루션은 간단한 도우미 메서드입니다 런타임에만. 타입 안전을 위해 엔티티 관리자를 직접 서비스에 삽입 할 수 있습니다.

+0

좋은 설명과 가능한 해결책에 대한 힌트, 감사합니다! 나는 조금 더 기다릴 것이지만, 아무도 더 좋은 것을 생각해 내지 않으면 당신의 대답을 받아 들일 것입니다. –

0

이 시도 :

$ queryBuilder = $ this-> getDoctrine() -> getManager() -> getRepository ('AppBundle : 제품') -> createQueryBuilder ('P'); 하고 phpstorm를 사용하는 경우 심포니 플러그인을 업데이트하거나 문제는 당신의 IDE 인 경우, 예를 들어, 반환이 가진 ObjectRepository 아님을 알 수 있습니다 IDE

+0

미안하지만 나는 내 질문에 대한 것입니다. 나는 이것을해볼 필요가 없습니다. 그것이 작동하고 있다는 것이 내 생각이 아닙니다. 내가 원하는 건 "instanceof"로 getManager()를 호출 할 필요없이 깨끗한 코드이다. ... –

0

을 무시 :

/** @var ProductRepository $repository */ 
$repository = $this->getDoctrine()->getRepository('AppBundle:Product'); 
$queryBuilder = $repository->createQueryBuilder('p'); 

당신은 그것이 당신이 얻는 것이라는 것을 알고 있기 때문에.

+0

내 문제는 내 IDE가 아니라 안전하고 코드를 정리하고 Doctrine 인터페이스가 제공하는 계약을 존중하는 것이다. –

+0

정적 형식의 언어에서 솔루션은 PHP로 가능하지 않은 유형 변환입니다. getRepository 메서드는 실제로 ProductRepository 인스턴스를 반환합니다. 그렇지 않습니까? 그래서 당신은 계약을 존중합니다. –

+0

아니요, ProductRepository 클래스가 없을 수도 있습니다. 내가 예상 할 수있는 것은 주어진 엔티티 유형에 대해 등록 된 ObjectRepository의 인스턴스입니다. –

관련 문제