2010-01-14 8 views
3

Doctrine에서 기본 hydrator를 설정하는 방법을 찾을 수 없습니다. 사용할 수 있어야합니다. 권리?Doctrine에서 기본 수화기를 설정하는 방법?

http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/data-hydrators.html#writing-hydration-method

위의 문서 페이지는 사용자 정의 하이드 레이터를 만드는 방법에 대해 설명합니다. 여기서 단점은 쿼리를 실행할 때마다 수화기를 "지정"해야한다는 것입니다.

답변

2

Chris Gutierrez의 의견을 읽고 일부 내용을 변경하여이 사실을 알았습니다.

먼저 Doctrine_Query에 대한 확장 클래스를 정의하십시오. 자신의 수화 모드를 정의하기 위해 생성자를 확장하십시오.

class App_Doctrine_Query extends Doctrine_Query 
{ 
    public function __construct(Doctrine_Connection $connection = null, 
     Doctrine_Hydrator_Abstract $hydrator = null) 
    { 
     parent::__construct($connection, $hydrator); 
     if ($hydrator === null) { 
      $this->setHydrationMode(Doctrine::HYDRATE_ARRAY); // I use this one the most 
     } 
    } 
} 

그런 다음 부트 스트랩에서 새 클래스에 대해 Doctrine에게 알려주십시오.

Doctrine_Manager::getInstance()->setAttribute(Doctrine_Core::ATTR_QUERY_CLASS, 'App_Doctrine_Query'); 

크리스 구티에레즈 대신 세계의 연결에 대한 속성을 정의하지만 둘 이상의 연결을 가지고 내가 그들 모두를 위해이 기본값을 사용하고 싶습니다.

이제는 쿼리를 작성할 때마다 Doctrine_Query :: setHydrationMode()를 호출 할 필요가 없습니다.

여기에 자세한 내용을
http://www.doctrine-project.org/projects/orm/1.2/docs/manual/configuration/en#configure-query-class

편집을이다 :

아래 변경 내가 위에 문제가 있음을 발견했다. 구체적으로, "Doctrine_Core :: getTable ('Model') -> find (1)"과 같은 일을하면 객체가 아니라 수화 배열이 반환됩니다. 그래서 나는 이것을 약간 변경하여 Query 호출에 사용할 사용자 정의 실행 메소드를 정의했습니다.

또한 메모리 추가 코드를 추가했습니다.

class App_Doctrine_Query extends Doctrine_Query 
{ 
    public function rows($params = array(), $hydrationMode = null) 
    { 
     if ($hydrationMode === null) 
      $hydrationMode = Doctrine_Core::HYDRATE_ARRAY; 
     $results = parent::execute($params, $hydrationMode); 
     $this->free(true); 
     return $results; 
    } 

    public function row($params = array(), $hydrationMode = null) 
    { 
     if ($hydrationMode === null) 
      $hydrationMode = Doctrine_Core::HYDRATE_ARRAY; 
     $results = parent::fetchOne($params, $hydrationMode); 
     $this->free(true); 
     return $results; 
    } 
} 
0

그건 좋은 생각이 될거야, 그리고 귀하의 질문을 읽고 나는 그것이 Doctrine을 통해 할 수있는 일이라고 생각했습니다. 그러나 코드를 읽으면 다음과 같이 생각할 수 없습니다.

Doctrine_Query::create() 두 번째 인수 - 수화 모드를 지정하지 않고 Doctrine_Query_Abstract::__construct()의 첫 번째 인수 만 연결을 지정하여 새 쿼리를 만듭니다. 구성 호출이 이루어지지 않습니다. 수화기가 전달되지 않으므로 새로운 Doctrine_Hydrator이 생성되고 생성자는 구성 옵션을 동등하게 고려하지 않으므로 기본값은 Doctrine::HYDRATE_RECORD입니다.

아마도 아래 팩토리 메서드로 Doctrine_Query를 서브 클래 싱하는 것이 가장 쉬운 방법일까요?

public static function create($conn = null) 
{ 
    return new Doctrine_Query($conn,Doctrine::HYDRATE_ARRAY); 
} 
+0

안녕하세요, 답변 해 주셔서 감사합니다. 기본적으로 커스텀 Query 클래스를 사용하도록 Doctrine에 지시하는 방법이 있다면 여러분의 아이디어가 효과적입니다. 그러한 기능이있을 경우 어떤 아이디어가 있습니까? 다시 한번 감사드립니다. –

+1

doctrine 쿼리 클래스를 설정하는 방법이 있어야합니다. $ conn-> setAttribute (Doctrine_Core :: ATTR_QUERY_CLASS, 'MyQueryClass'); - Doctrine 1.2 문서 http://www.doctrine-project.org/projects/orm/1.2/docs/manual/configuration/en에 있습니다. –

관련 문제