2011-12-08 78 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