如何在Symfony2服务类中访问Doctrine DBAL?

时间:2011-08-04 09:44:15

标签: symfony doctrine

2 个答案:

答案 0 :(得分:37)

首先,你应该在你的班级中添加一个构造函数并传入@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注入,工厂注入等)并更好地理解依赖注入的工作原理

答案 1 :(得分:9)

@doctrine.dbal.connection无法正常工作,正如Igor所说,@doctrine.dbal.connection是摘要,如果您只有一个数据库连接则使用@doctrine.dbal.default_connection,或@doctrine.dbal.%connection_name%_connection使用%connection_name% } placeholder要注入的连接的名称。

您的服务配置现在应如下所示:

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