Dependency injection 服务容器如何创建services.yml中声明的对象?
考虑以下代码:Dependency injection 服务容器如何创建services.yml中声明的对象?,dependency-injection,symfony,Dependency Injection,Symfony,考虑以下代码: public function showActiveJobsAction($slug) { $em = $this->getDoctrine()->getEntityManager(); $category = $em->getRepository('JobeetBundle:Category')->findBySlug($slug); if (! $category) { throw $this->cr
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_服务需要JobeetBundle:类别存储库才能工作。存储库被传递给服务构造函数。这些都是在services.yml中定义的
所以在本例中,我得到了JobeetBundle的两个实例:Category repository类
如果是,我如何更改我的设计以使其更好
可能最好像这样创建代码:
$jobService->getCatetoryWithActiveJobsByItsSlug($slug)
但我仍然想知道容器在创建对象之前是否会查找对象存在?一般来说,在Symfony2中不会得到重复的存储库(或服务),所以不用担心 这:
是一种更好的方法,因为它对控制器隐藏了实体管理器/存储库的内容。您可以(至少在理论上)将整个Doctrine2引擎替换为其他引擎,并且仍然可以使用控制器代码。一般来说,您不会在Symfony2中获得重复的存储库(或服务),因此无需担心 这:
是一种更好的方法,因为它对控制器隐藏了实体管理器/存储库的内容。您可以(至少在理论上)将整个Doctrine2引擎与其他引擎交换,并且仍然可以使用控制器代码。当您从容器中获得服务时,默认情况下,您总是得到相同的实例。当这个服务被注入另一个服务时,它也是同一个实例 因此,您不必担心两个问题,您只会得到一个服务实例
job\u服务
以下是摘自:
另外,邮件服务只创建一次,每次请求该服务时都返回相同的实例。这几乎总是您需要的行为(它更灵活、更强大)
希望有帮助 当您从容器中获得服务时,默认情况下,您总是得到相同的实例。当这个服务被注入另一个服务时,它也是同一个实例 因此,您不必担心两个问题,您只会得到一个服务实例
job\u服务
以下是摘自:
另外,邮件服务只创建一次,每次请求该服务时都返回相同的实例。这几乎总是您需要的行为(它更灵活、更强大)
希望有帮助
$jobService->getCatetoryWithActiveJobsByItsSlug($slug)