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

Acy*_*yra 26 doctrine symfony

我正在学习Symfony2(和OOP)并希望创建一个可在我的应用程序中使用的服务.此服务获取值foo,根据数据库表进行检查,并返回值栏.

我有一个小班

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;
    }


}
Run Code Online (Sandbox Code Playgroud)

我的设置是:

services:
    toolbox:
       class:        Acme\TestBundle\Toolbox
        arguments:   [@database_connection]
Run Code Online (Sandbox Code Playgroud)

但它抛出一个错误,说get()方法是未定义的.我被困了 - 我怎么能在服务中使用DBAL?谢谢!

cat*_*che 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;
    }


}
Run Code Online (Sandbox Code Playgroud)

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

parameters:
 my_service_connection: default

services:
 toolbox:
   class:        Acme\TestBundle\Toolbox\StringToolbox
    arguments:   [@doctrine.dbal.%my_service_connection%_connection]
Run Code Online (Sandbox Code Playgroud)

你在这个配置中说的是"让我成为一个名为工具箱的服务,它将接收doctrine.dbal.default_connection服务作为第一个构造函数参数"

除了构造函数注入之外还有其他注入方法,您应该阅读http://symfony.com/doc/current/book/service_container.html文档以掌握所有可能性(Setter注入,工厂注入等)并且更好了解依赖注入如何工作

  • `@ doctrine.dbal.connection`服务是一个摘要.尝试使用`@ doctrine.dbal.%connection_name%_connection`,其中`%connection_name%`占位符是要注入的连接的名称. (5认同)

Ste*_*ing 10

@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]
Run Code Online (Sandbox Code Playgroud)