2012-02-04 17 views
0

考慮以下代碼:Service Container如何創建在services.yml中聲明的對象?

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

當你從容器中獲取服務,默認情況下,你總是得到相同的實例。當這個服務被注入另一個時,它也是同一個實例。

所以你不要有兩個擔心,你得到的服務job_service只有一個實例。

下面是來自Symfony2 book, chapter Service Container的摘錄:

作爲一個額外的獎勵,梅勒服務只創建一次,每次索要服務同一時刻被返回。這幾乎總是您需要的行爲(它更加靈活和強大)。

希望有所幫助!

1

一般情況下,你不會得到Symfony2的所以不用擔心有重複的倉庫(或服務)。

此:

$jobService->getCatetoryWithActiveJobsByItsSlug($slug) 

是一個更好的辦法,只是因爲它從你的控制器隱藏了實體管理器/庫的東西。你可以(至少在理論上)用其他東西替換整個Doctrine2引擎,並且仍然可以使用你的控制器代碼。