2014-04-09 43 views
1

我想知道使用Doctrine 2.4是否可以做到以下幾點。對Doctrine2代理生成的影響

假設我們有一個看起來像這樣的實體:

 
/** 
* @ORM\Entity 
* @ORM\Table 
*/ 
class SomeEntity { 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="bigint") 
    * @ORM\GeneratedValue 
    */ 
    protected $some_really_long_named_id; 
    public function getSomeReallyLongNamedId() { return $this->some_really_long_named_id; } 
} 

由於我們從事IT行業,我們是懶惰的,我說這個方法:

 
public function getId() { return $this->some_really_long_named_id; } 

當這個實體代理和我們在這個實體的代理上調用getId(),實體是懶加載的。這很奇怪,因爲我們稱getSomeReallyLongNamedId()時不會發生這種情況。

顯然這與Doctrine的代理對象中的一些魔法有關。生成的代理方法是這樣的:

 
    /** 
    * {@inheritDoc} 
    */ 
    public function getId() 
    { 

     $this->__initializer__ && $this->__initializer__->__invoke($this, 'getId', array()); 

     return parent::getId(); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    public function getSomeReallyLongNamedId() 
    { 
     if ($this->__isInitialized__ === false) { 
      return parent::getSomeReallyLongNamedId(); 
     } 


     $this->__initializer__ && $this->__initializer__->__invoke($this, 'getSomeReallyLongNamedId', array()); 

     return parent::getSomeReallyLongNamedId(); 
    } 

有什麼辦法來影響ProxyGenerator,以確保當getId()方法被調用,它並不意味着延遲加載的?

回答

0

我知道你的問題我很老,但我正在尋找解決同一問題的方法。

我找到了一種方法做禁用直接延遲加載與註釋:

/** @Id **/ 
protected $id; 

/** @IdGetter **/ 
public function getId() { 
... 
} 

,這將迫使在代理類的初始化測試:

/** 
* {@inheritDoc} 
*/ 
public function getId() 
{ 
    if ($this->__isInitialized__ === false) { 
     return parent::getId(); 
    } 

    $this->__initializer__ && $this->__initializer__->__invoke($this, 'getId', array()); 

    return parent::getId(); 
} 

編輯#1

getId()方法必須小於4行(@Generator.php方法isShortIdentifierGetter())以檢測爲標識符ty getter。

+0

我無法在IdGetter註釋中找到任何參考。有[功能請求](http://www.doctrine-project.org/jira/browse/DDC-687),其中聲明它已實施。但是,在當前的[註解類目錄](https://github.com/doctrine/doctrine2/tree/master/lib/Doctrine/ORM/Mapping)中沒有提及它。 我不能得到它的工作。可能因爲我的情況不同:除了默認的'getId'方法外,我還使用了第二個getter。 – hvtilborg