【问题标题】:How do you access Doctrine DBAL in a Symfony2 service class?如何在 Symfony2 服务类中访问 Doctrine DBAL?
【发布时间】:2011-10-19 19:59:59
【问题描述】:

我正在学习 Symfony2(和 OOP)并希望创建一个在我的应用程序中可用的服务。该服务接受一个值 foo,对照数据库表检查它,并返回一个值 bar。

我有一堂小课

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?谢谢!

【问题讨论】:

    标签: symfony doctrine


    【解决方案1】:

    首先你应该在你的类中添加一个构造函数并传入@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]
    

    您在此配置中所说的是“为我创建一个名为 toolbox 的服务,它将接收 todbal.dbal.default_connection 服务作为第一个构造函数参数”

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

    【讨论】:

    • 这很有帮助! Symfony 文档很棒,但它们假设了完整的 OOP 知识,我有一些差距。谢谢!
    • 由于某种原因这不再有效,我必须传递一个不同的参数:参数:[@database_connection]
    • @doctrine.dbal.connection 服务是一个抽象。尝试使用@doctrine.dbal.%connection_name%_connection,其中%connection_name% 占位符是您要注入的连接的名称。
    • @IgorTimoshenko,感谢您的回答。如果我们使用@doctrine.dbal.%connection_name%_connection 方法,那么我们如何将%connection_name% 传递给10 个可能的连接中的所需连接?
    • @Nis %connection_name% 是一个参数,您可以在 parameters.ini、parameters.yml 或 yaml 配置文件的 parameters: 部分中设置它。它将由 DI 容器自动插入。看我上面的例子
    【解决方案2】:

    @doctrine.dbal.connection 不起作用,正如 Igor 所说,@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]
    

    【讨论】:

    • 感谢您的回答。如果我们使用@doctrine.dbal.%connection_name%_connection 方法,那么我们如何传递%connection_name% 以获得所需的连接?
    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2011-09-26
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多