2013-04-25 35 views
0

我一直在查找symfony是如何做到的dependency injection。但我不明白它的直接目的。依賴注入Symfony對象創建參數

它似乎將一切都視爲服務。服務是沿着配置的路由器的線路。這些服務中的大多數都具有啓動所需的設置變量的基線。但有一種叫做'isShared'的方法。

我假設在使用該方法時,它會創建一個新的Object而不是已經創建的Object。

但是當要創建的對象需要一個完全不同的變量時會發生什麼?

class foobarClass 
{ 
    public function __construct($config.foo) 
    { 
     // 
    } 
} 

$container = new sfContainerBuilder(array('config.foo' => 'bar')); 

$container->register('foobar','foobarClass') 
      ->addArgument('%config.foo%') 
      ->isShared(false); 

什麼是config.foo不應該是酒吧,而是foo?我是否需要爲基本上每種可能的配置創建另一個定義(看起來很奇怪並且破壞DIC的目的)?

另外什麼是依賴注入和逆控制之間的主要區別?什麼是什麼時候什麼地方?

在此先感謝!

編輯:

的參數問題又如:

class Files 
{ 
    protected $_path; 

    public function __construct($path) 
    { 
     $this->_path = $path; 
    } 
} 

$container = new sfContainerBuilder(array('path.to.something' => '/some/path/file.abc')); 

$container->register('files','files') 
      ->addArgument('path.to.something') 
      ->isShared(false); 

我怎樣,如果需要給一個新的路徑?這個定義已經有了path.to.something。但是如果我需要一個帶有path.sto.somethingElse的對象呢?

+0

依賴注入是控制反轉的一種方法。還有很多其他方法可以進行控制反轉。至於你的參數,並不重要,因爲配置通常是從配置文件中讀取的,不會在應用程序執行時發生改變(儘管你的問題令人困惑,因爲你標記了SF2,但你的代碼看起來像SF1)。 – mpm 2013-04-25 21:58:11

+0

我的不好,認爲這是SF2。 – John 2013-04-26 12:12:05

回答

0

在Symfony2中,服務是一個普通的類,不需要類繼承。
目的是你不需要關心發起的對象。
對於非常小的應用程序,似乎沒有必要,但當某些對象之間存在依賴關係時,它可能會變成問題。例如:你有4個對象跟這個有關係:
乙-needs-> A,C -needs-> A,d -needs->乙&Ç

這時它是真正有用的配置開始不是在每個類的內部,而是將它寫入(在這種情況下)到services.xml/services.yml中。有時在此上下文中使用控制的反轉,它更通用。但是在這種情況下(控制依賴注入)的控制反轉也完成了,因爲你在對象之外處理啓動。

您的其他問題:

什麼是config.foo不應該是吧,但富?

您可以不在構造函數中傳遞參數,您可以在另一個函數中傳遞它們。 另一種解決方案,當你真的需要一個說法很多次,但想也靈活,你也可以使用雙方繼承(DI和類)documentaion for Parent Services

但對於第一次,我建議你用mailer例如閱讀本,這真的很容易:http://symfony.com/doc/current/components/dependency_injection/introduction.html 然後你可以繼續下一頁關於不同類型的注入等等。