2011-08-04 38 views
23

我在學習Symfony2(和OOP),並希望創建一個可在我的應用程序中使用的服務。這個服務接受一個值foo,根據數據庫表檢查它,並返回一個值欄。如何訪問Symfony2服務類中的Doctrine DBAL?

我有一點點類

namespace Acme\TestBundle\Toolbox; 

class StringToolbox 
{ 
    public function lookupSomething($foo) 
    { 

     $conn = $this->get('database_connection'); 
     $sql = "SELECT bar FROM bar_list WHERE foo = :foo"; 
     $stmt = $conn->prepare($sql); 
     $stmt->bindValue("foo", $foo); 
     $stmt->execute(); 


     return $bar; 
    } 


} 

我的設置是:

services: 
    toolbox: 
     class:  Acme\TestBundle\Toolbox 
     arguments: [@database_connection] 

但它拋出一個錯誤說,get()方法是不確定的。我卡住了 - 如何在服務中使用DBAL?謝謝!

回答

34

首先,你應該在構造函數添加到類,並通過在@doctrine.dbal.%connection_name%_connection service

namespace Acme\TestBundle\Toolbox; 
use Doctrine\DBAL\Connection; 

class StringToolbox 
{ 
    /** 
    * 
    * @var Connection 
    */ 
    private $connection; 

    public function __construct(Connection $dbalConnection) { 
     $this->connection = $dbalConnection;  
    } 

    public function lookupSomething($foo) 
    { 

    $sql = "SELECT bar FROM bar_list WHERE foo = :foo"; 
    $stmt = $this->connection->prepare($sql); 
    $stmt->bindValue("foo", $foo); 
    $stmt->execute(); 


    return $bar; 
    } 


} 

服務配置現在看起來應該是這樣:

parameters: 
my_service_connection: default 

services: 
toolbox: 
    class:  Acme\TestBundle\Toolbox\StringToolbox 
    arguments: [@doctrine.dbal.%my_service_connection%_connection] 

你所說的這種配置「使我成爲一個名爲工具箱的服務,它將接收doctrine.dbal.default_connection服務作爲第一個構造方法參數」

有除了構造函數注入其他注射方法,你應該閱讀http://symfony.com/doc/current/book/service_container.html文檔,以獲得的所有可能性的把握(setter注入,工廠注射等),以更好地理解依賴注入是如何工作的

+0

這有很大幫助! Symfony文檔很好,但他們承擔全面的面向對象的知識,並且我有一些差距。謝謝! – Acyra

+0

出於某種原因,這不再起作用,我必須通過一個不同的參數:參數:[@database_connection] – Acyra

+5

@ doctrine.dbal.connection'服務是一個摘要。嘗試使用'@ doctrine.dbal。%connection_name%_connection',其中'%connection_name%'佔位符是要注入的連接的名稱。 –

9

@doctrine.dbal.connection不工作,作爲伊戈爾說,@doctrine.dbal.connection是一個抽象的,使用@doctrine.dbal.default_connection,如果你只有一個數據庫連接,或@doctrine.dbal.%connection_name%_connection其中%connection_name%佔位符的連接,你想要注入的名稱。

服務配置現在看起來應該是這樣:

services: 
toolbox: 
    class:  Acme\TestBundle\Toolbox\StringToolbox 
    arguments: [@doctrine.dbal.default_connection] 
+0

謝謝你的回答。如果我們使用@ doctrine.dbal。%connection_name%_connection'方法,那麼我們如何傳遞'%connection_name%'作爲所需的連接? – Nis