2011-12-08 31 views
1

我希望在我的文章實體上使用setter注入,但我對此並不瞭解,也不太瞭解它。如何在實體上使用setter依賴注入

我的錯誤是:

My\NewsBundle\Entity\Article 
Fatal error: Call to a member function addArticle() on a non-object 

這發生在我的文章實體:

/** Inject service: search */ 
protected $search; 
public function setSearch(Search $search) 
{ 
    $this->search = $search; 
} 

/** @ORM\PostPersist */ 
public function postPersist() 
{ 
    // wrong: does not have id yet for prePersist; changed to postPersist 
    //$search = new \My\NewsBundle\Entity\Search(); 
    echo get_class($this->search); 
    $this->search->addArticle($this); 
} 

FYI:我config.yml有:

# Parameters 
parameters: 
    search.class: My\NewsBundle\Entity\Search 
    google.class: My\NewsBundle\Entity\Google 
    flickr.class: My\NewsBundle\Entity\Flickr 
    article.class: My\NewsBundle\Entity\Article 

# Servers 
services: 
    search: 
    class:  %search.class% 
    google: 
    class:  %google.class% 
    flickr: 
    class:  %flickr.class% 
    article: 
    class:  %article.class% 
    calls: 
     -   [setSearch, [@search]] 

FYI:我運行一個ContainerAwareCommand並使用一個feed;從飼料實體提取:

 $article = $em->getRepository('MyNewsBundle:Article')->findOneBy(array('feed'=>$this->getId(), 'link'=>$item->link())); 
     if (!$article) { 
      $article = new \My\NewsBundle\Entity\Article(); 

如何setter注入工作或如何讓我的實體服務的任何意見,將不勝感激。

+0

我建議你重新考慮你如何管理你的代碼。實體類被設計成POPO(管理非常基本的setter/getter功能)。你試圖做的更適合於一個entityManager類型的類。 – Inoryy

回答

0

實體不由服務容器管理也不創建。 Doctrine負責將數據庫結果轉換爲實體。

如果您想將搜索服務注入您的Article實體,您必須手動完成。由於它是一個可選的依賴項(可以使用setter注入它),所以還應該檢查(post | pre)Persist鉤子中是否爲空。

例子:

$article = $em->getRepository('MyNewsBundle:Article') 
    ->findOneBy(array('feed'=>$this->getId(), 'link'=>$item->link())); 

if (!$article) { 
    $article = new \My\NewsBundle\Entity\Article(); 
} 

$article->setSearch($this->get('search')); 
+0

如果切換到單獨的事件偵聽器而不是生命週期回調,那麼它可以是您可以使用容器管理的服務。在這本食譜文章http://symfony.com/doc/2.0/cookbook/doctrine中有更多關於這方面的信息。這也將推動索引文章本身的責任,以及如果你想索引其他實體可重用的責任。 –

+0

@RichardMiller只是站起來,鏈接是404 –

+0

我現在明白了。謝謝庫巴。 @RichardMiller,非常感謝你的時間。我肯定會考慮並研究事件監聽器,絕對是一個很好的選擇,也許我在尋找什麼,因爲我沒有使用生命週期回調修改實體上的任何屬性。 – Tjorriemorrie