2011-09-17 141 views
15

我有一個實體,稱爲Game一個名爲GameRepository相關庫:如何從實體獲取儲存庫?

/** 
* @ORM\Entity(repositoryClass="...\GameRepository") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class Game { 
    /** 
    * @ORM\prePersist 
    */ 
    public function setSlugValue() { 
     $this->slug = $repo->createUniqueSlugForGame(); 
    } 
} 

在prePersist的方法,我需要確保遊戲的蛞蝓領域是獨一無二的,這需要一個數據庫查詢。要進行查詢,我需要訪問EntityManager。我可以從GameRepository中獲取EntityManager。所以:如何從遊戲中獲取GameRespository?

回答

9

你不知道。在Doctrine 2中的實體應該知道實體管理器或存儲庫,而不是

一個典型的解決方案就是向存儲庫(或服務類)添加一個方法,該方法用於創建(或調用來存儲)新實例,並且還會生成一個獨特的slug值。

+2

他們爲什麼選擇這樣做?它似乎使一切都變得更加困難和乾燥。 –

+0

@JasonSwett是的,塞子的情況有點煩人。在大多數其他情況下,分離的方式會少一些,比如當測試一些事情時,如果沒有棘手的依賴關係進行配置,它會變得更容易。 –

+1

存儲庫中「創建新實例」的方法...真的嗎?存儲庫不是隻需要獲取數據? – Jean

1

爲了保持邏輯封裝而不必改變保存實體的方式,而不是簡單的prePersist生命週期事件,您需要查看使用更強大的Doctrine事件,這些事件可以訪問的不僅僅是實體本身。

您應該看看DoctrineSluggableBundleStofDoctrineExtensionsBundle捆綁包,它們可能只是您需要的。

4

,你可以注入主義實體管理器在實體 (使用JMSDiExtraBundle) 和有這樣的倉庫:

/** 
* @InjectParams({ 
*  "em" = @Inject("doctrine.orm.entity_manager") 
* }) 
*/ 
    public function setInitialStatus(\Doctrine\ORM\EntityManager $em) { 


    $obj = $em->getRepository('AcmeSampleBundle:User')->functionInRepository(); 
    //... 
} 

看到這一點:http://jmsyst.com/bundles/JMSDiExtraBundle/1.1/annotations

48

你其實可以得到庫在你的實體中,只有在生命週期回調期間。你非常接近它,你所要做的就是收到LifecycleEventArgs參數。

另見http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html

use Doctrine\ORM\Event\LifecycleEventArgs; 

/** 
* @ORM\Entity(repositoryClass="...\GameRepository") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class Game { 
    /** 
    * @ORM\prePersist 
    */ 
    public function setSlugValue(LifecycleEventArgs $event) { 
     $entityManager = $event->getEntityManager(); 
     $repository = $entityManager->getRepository(get_class($this)); 

     $this->slug = $repository->createUniqueSlugForGame(); 
    } 
} 

PS。我知道這是一個古老的問題,但我回答了它,以幫助任何未來的谷歌。

+5

我很高興你能恢復它 - 我是未來的Google員工之一。我實際上已經在生命週期回調中工作,並且堅持我的對象依賴於創建或獲取相關對象。 – nealio82

+2

爲我工作(Symfony 2.4),我認爲這將是公認的答案! – mboullouz

+0

未來的Google員工 - > – Prof83