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

时间:2011-12-08 07:15:48

标签: 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)
{
    $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);
}

仅供参考:我的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]]

仅供参考:我正在运行ContainerAwareCommand并且使用Feed;从Feed实体中提取:

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

关于如何使用setter注入工作或如何在我的实体中获得该服务的任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

如果要将搜索服务注入文章实体,则必须手动执行。因为它是一个可选的依赖项(你用一个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'));