Как использовать установку зависимости сеттера от сущности - PullRequest
1 голос
/ 08 декабря 2011

Я хочу использовать сеттерную инъекцию для моей статьи, но я новичок в этом и не очень хорошо понимаю.

Моя ошибка:

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, которая потребляет канал; выписка из Фида субъекта:

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

Буду весьма признателен за любые советы о том, как работает инъекция сеттера или как получить эту услугу в моей организации.

1 Ответ

0 голосов
/ 08 декабря 2011

Объекты не управляются и не создаются сервисным контейнером. Doctrine отвечает за перевод результатов базы данных в сущности.

Если вы хотите внедрить службу поиска в вашу сущность Article, вы должны сделать это вручную. Поскольку это скорее необязательная зависимость (вы вводите ее с помощью установщика), вам также следует проверить, не является ли она нулевой в вашем (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'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...