Как Service Container создает объект, объявленный в services.yml? - PullRequest
0 голосов
/ 05 февраля 2012

Рассмотрим этот код:

public function showActiveJobsAction($slug)
{
     $em = $this->getDoctrine()->getEntityManager();
     $category = $em->getRepository('JobeetBundle:Category')->findBySlug($slug);
     if (! $category) {
        throw $this->createNotFoundException('Unable to find Category entity.');
     }

     $jobService = $this->container->get('job_service');
     $category = $jobService->populateCategoryByItsActiveJobs($category);

     return $this->render('JobeetBundle:Category:jobs.html.twig', array(
        'category'      => $category,
    ));        
}

job_service нужен JobeetBundle: репозиторий категорий для работы. Репозиторий передается сервисному конструктору. Это все определено в services.yml

Итак, в этом случае я получаю два экземпляра JobeetBundle: класс репозитория категорий?

Если да, как я могу изменить свой дизайн, чтобы сделать его лучше?

Вероятно, лучше создать код, например:

$jobService->getCatetoryWithActiveJobsByItsSlug($slug)

но мне все еще интересно, ищет ли контейнер существование объекта перед его созданием?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Когда вы получаете сервис из контейнера, по умолчанию вы получаете всегда один и тот же экземпляр. Это также тот же случай, когда этот сервис внедряется в другой.

Так что вам не о чем беспокоиться, вы получаете только один экземпляр услуги job_service.

Вот выдержка из книги Symfony2, глава Сервисный контейнер :

В качестве дополнительного бонуса служба Mailer создается только один раз, и один и тот же экземпляр возвращается каждый раз, когда вы запрашиваете службу. Такое поведение почти всегда вам нужно (оно более гибкое и мощное).

Надеюсь, это поможет!

1 голос
/ 05 февраля 2012

В общем, вы не получите дубликаты репозиториев (или сервисов) в Symfony2, так что не беспокойтесь.

Это:

$jobService->getCatetoryWithActiveJobsByItsSlug($slug)

Это лучший подход просто потому, что он скрывает менеджер сущностей/ репозиторий вещи с вашего контроллера.Вы можете (по крайней мере, в теории) заменить весь движок Doctrine2 чем-то другим, и ваш код контроллера все равно будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...