2014-02-20 96 views
5

的新實例我使用的symfony /依賴注入組件(注意:不是使用完整的堆棧框架)Symfony的依賴注入注入

當註冊一個新的服務,我想在構造一個新的實例注入一類。示例:

$container->register('session', 'Vendor\Core\Session') 
    ->addArgument(new PhpBridgeSessionStorage()); 

該示例運行良好,但如果我想使用yml文件來定義此服務,該怎麼辦?類似於:

services: 
    session: 
    class: Vendor\Core\Session 
    arguments: [ new Class\To\Inject ] 

我是否被迫將Class \ To \ Inject定義爲新服務?或創建一個服務工廠?

回答

1

是的,你注入的所有課程都應該是服務。您可以給他們一個範圍prototype以在每次請求時創建一個新實例。

欲瞭解更多信息,請參閱:http://symfony.com/doc/current/cookbook/service_container/scopes.html

+1

這意味着污染的配置文件有很多的用途,一旦服務那個哈沒有依賴關係,不應該在集裝箱的建築物外使用。在這種情況下,我寧願用PHP構建容器的這部分。 – spdionis

+0

@spdionis如果它不應該在容器外部使用,它們應該被標記爲'public = false'(private)。你必須把它們放入一個容器,這是它的工作原理:) –

+1

我只是害怕結束了100服務。 – spdionis

1

我現在這個問題是很老,但這裏要說的是,你可以用它來避免定義每一個簡單的類作爲服務定義接收的類來創建一個「工廠級」的服務一招作爲參數,通過後,「表達式語言」注入作爲參數:

<?php 

final class ClassFactory 
{ 
    public static function create($class, array $arguments = []) 
    { 
    return new $class($arguments); 
    } 
} 
  • 創建新的服務

    app.class_factory: 類:

    的ClassFactory
  • 後注入新的類這樣的:

    參數:['@ =服務( 「app.class_factory」)創建( 「獨白\記錄器」 )「]

爲symfony1.2> = 2.8,你可以去看一下‘自動佈線’功能也 - >http://symfony.com/blog/new-in-symfony-2-8-service-auto-wiring