【问题标题】:How Service Container create object declared in services.yml?Service Container 如何创建在 services.yml 中声明的对象?
【发布时间】:2012-02-04 20:51:59
【问题描述】:

考虑这段代码:

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:Category 存储库才能工作。存储库被传递给服务构造函数。都是在 services.yml 中定义的

所以在这种情况下,我最终得到了两个 JobeetBundle:Category 存储库类的实例?

如果是,我怎样才能改变我的设计以做得更好?

可能最好像这样创建代码:

$jobService->getCatetoryWithActiveJobsByItsSlug($slug)

但我仍然想知道容器是否在创建之前寻找对象存在?

【问题讨论】:

    标签: dependency-injection symfony


    【解决方案1】:

    当您从容器中获取服务时,默认情况下,您总是得到相同的实例。当这个服务注入另一个服务时也是同一个实例。

    所以你不用担心两个,你只会得到一个服务实例job_service

    这是Symfony2 book, chapter Service Container的摘录:

    作为额外的好处,Mailer 服务只创建一次,并且每次您请求该服务时都会返回相同的实例。这几乎总是您需要的行为(它更灵活、更强大)。

    希望有帮助!

    【讨论】:

      【解决方案2】:

      一般来说,您不会在 Symfony2 中获得重复的存储库(或服务),所以不用担心。

      这个:

      $jobService->getCatetoryWithActiveJobsByItsSlug($slug)
      

      这是一种更好的方法,因为它对控制器隐藏了实体管理器/存储库的内容。您可以(至少在理论上)将整个 Doctrine2 引擎换成其他东西,而您的控制器代码仍然可以工作。

      【讨论】:

        猜你喜欢
        • 2018-02-28
        • 2023-01-09
        • 2019-05-26
        • 2023-04-09
        • 1970-01-01
        • 2014-12-12
        • 2018-04-18
        • 1970-01-01
        • 2022-08-20
        相关资源
        最近更新 更多