2011-12-08 9 views
1

私の記事実体にセッター注入を使用したいと思いますが、私はこれを初めて知り、それをあまりよく理解しません。実体にセッター依存性注入を使用する方法

私のエラーは、次のとおりです。

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を実行しており、フィードを消費しています。フィードエンティティからの抽出:

セッター注入の仕組みや自分のエンティティでのそのサービスの入手方法に関するアドバイスは大歓迎です。

+0

私はあなたがあなたのコードの管理方法を見直す示唆しています。エンティティクラスは、(非常に基本的なセッター/ゲッター機能を管理するための)POPOであるように設計されています。あなたがやろうとしていることは、entityManager型のクラスにもっと適合します。 – Inoryy

答えて

0

エンティティは、サービスコンテナによって管理も作成もされません。 Doctrineは、データベースの結果をエンティティに変換する役割を担います。

Article Entityに検索サービスを挿入する場合は、手動で行う必要があります。オプションの依存関係(セッターで注入する)であるため、(ポスト|プリ)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

を理解しています。ありがとう。 @リチャードミラー、ありがとうございました。私はライフサイクルコールバックで自分のエンティティのプロパティを変更していないので、間違いなくイベントリスナーを検討して、間違いなく良いオプションを探しています。 – Tjorriemorrie

関連する問題