Php 如何在实体上使用setter依赖项注入

Php 如何在实体上使用setter依赖项注入,php,symfony,dependency-injection,Php,Symfony,Dependency Injection,我希望在我的文章实体上使用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) {

我希望在我的文章实体上使用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);
}
仅供参考:my 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]]
仅供参考:我正在运行ContainerWareCommand,它消耗一个提要;从提要实体中提取:

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

如果您能就setter注入如何工作或如何在我的实体中获得该服务提供任何建议,我们将不胜感激。

实体不是由服务容器管理或创建的。条令负责将数据库结果转换为实体

如果您想将搜索服务注入到您的文章实体中,您必须手动进行。由于它是一个可选的依赖项(您使用setter注入它),您还应该在(post | pre)Persist钩子中检查它是否为null

例如:

$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'));

如果切换到单独的事件侦听器而不是生命周期回调,则可以使用容器管理该服务。在这本烹饪书的文章中有更多关于这方面的信息。这也将把为文章编制索引的责任从文章本身转移出去,如果您想为其他文章编制索引,还可以重复使用entities@RichardMiller只是提醒一下,链接是404,我现在明白了。谢谢库巴@理查德米勒,非常感谢你抽出时间。我肯定会考虑和查看事件侦听器,当然是一个很好的选择,也许是我正在寻找的,因为我没有用生命周期回调来修改我的实体上的任何属性。我建议你重新考虑如何管理你的代码。实体类被设计为POPO(用于管理非常基本的setter/getter功能)。您试图做的更适合entityManager类型的类。