Php 如何在实体上使用setter依赖项注入
我希望在我的文章实体上使用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) {
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类型的类。