我希望在我的文章实体上使用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注入工作或如何在我的实体中获得该服务的任何建议将不胜感激。
答案 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'));