2011-06-16 48 views
1

我在config.yml中定義了一個服務如何在Symfony 2中不是服務的類中訪問容器

services: 
    kinorm_pdo: 
    class: Pate\KinormBundle\Dbal\Db 
    arguments: [%kinorm.db_driver%,%kinorm.db_user%,%kinorm.db_pass%,%kinorm.db_name%,%kinorm.db_host%,%kinorm.db_charset%] 

但是我想在一個不是控制器的類中訪問這個服務,我不明白如何在不注入容器的情況下訪問容器。

基本上我只想做

$user = new User(); 

並且內部$ user訪問容器...

感謝您的任何建議!

+0

爲什麼不在控制器中創建一個返回容器的靜態函數? – Creasixtine 2012-02-17 08:16:21

回答

4

好了,你沒有從對象內部的控制器直接訪問,除非你做注入它(這是最有可能是一個壞主意,順便)...但如果你希望你的kinorm_pdo服務可從您的User類,只是注入(假設你實例從容器感知上下文類):

$user = new User($this->container->get('kinorm_pdo')); 

甚至

$user = new User(); 
$user->setPdo($this->container->get('kinorm_pdo')); 

請注意,它聽起來像你試圖提供從一個實體內的數據庫訪問... separation of concerns說這可能不是最乾淨的方式來完成任何你想做的事情......如果你提供更多一點關於你想要完成的內容的信息,我們也可以幫你解決這個問題。

+0

那麼你完全理解,我試圖從我的模型中訪問我的數據庫,我只是不明白爲什麼我不能在我的對象中查詢。我發現這麼多的情況下,創建一個存儲庫似乎很奇怪... – 2011-06-17 10:12:26

+0

我同意問題。把你的方法放入一個存儲庫然後將一個用戶傳遞給存儲庫方法會好得多。 Doctrine存儲庫已經知道要使用哪個EntityManager,然後你的問題就消失了。 – markymark 2011-06-20 08:41:26

+0

是的,這是一個不同的形式,過去如何做,無論好壞。 @markymark是完全正確的,你應該習慣於把你的方法放入你的倉庫並將用戶對象傳遞給該方法(例如'getSomeComplicatedInformationForUser($ user)')。這是一個更多的工作,你可能需要爲控制器中的模板做更多的準備,但總體來說它是一個稍微更清晰的模式。 – weaverryan 2011-12-24 20:04:54

相關問題