【问题标题】:How to use setter dependency injection on entity如何在实体上使用 setter 依赖注入
【发布时间】:2011-12-08 07:15:47
【问题描述】:

我希望在我的文章实体上使用 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 实体中提取:

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

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

【问题讨论】:

  • 我建议您重新考虑如何管理您的代码。实体类被设计为 POPO(用于管理非常基本的 setter/getter 功能)。您正在尝试做的事情更适合 entityManager 类型的类。

标签: php symfony dependency-injection


【解决方案1】:

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

如果您想为您的文章实体注入搜索服务,您必须手动进行。由于它是一个可选的依赖项(您使用 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'));

【讨论】:

  • 如果您切换到单独的事件侦听器而不是生命周期回调,那么这可以是您可以使用容器管理的服务。在本食谱文章symfony.com/doc/2.0/cookbook/doctrine 中有更多信息。这也将把文章索引的责任移出文章本身,如果你想索引其他实体,也可以重复使用
  • @RichardMiller 只是提醒一下链接是 404
  • 我现在明白了。谢谢库巴。 @RichardMiller,非常感谢您抽出宝贵时间。我肯定会考虑并研究事件侦听器,这绝对是一个不错的选择,也许我正在寻找什么,因为我没有使用我的生命周期回调修改我的实体上的任何属性。
猜你喜欢
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 2020-02-21
相关资源
最近更新 更多