在Symfony 2 / Doctrine 2中拥有一个带有DBAL连接的自定义存储库?

时间:2013-02-01 07:55:33

标签: doctrine doctrine-orm symfony-2.1

我正在尝试将默认的DBAL连接注入到与实体关联的自定义存储库中,这样我就可以进行一些原始的SQL查询。

在services.mxl

<service id="acme.repository.document" class="Acme\Bundle\Repository\DocumentRepository">
      <argument type="service" id="doctrine.orm.entity_manager" />
      <argument>Acme\Bundle\Entity\Document</argument>
      <argument type="service" id="database_connection" />
</service>

在我的存储库类DocumentRepository.php

class DocumentRepository extends EntityRepository {

    protected $conn;

    public function __construct($em, $class, Connection $conn)
    {
        $this->conn = $conn;
         parent::__construct($em,$class);
    }

但是我收到了这个错误:

  

可捕获的致命错误:参数3传递给   Acme \ Bundle \ Repository \ DocumentRepository :: __ construct()必须是   Doctrine \ DBAL \ Connection的实例,没有给出,调用   /project/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php on   第689行并在中定义   /project/src/Acme/Bundle/Repository/DocumentRepository.php第18行

你可以帮帮我吗?

4 个答案:

答案 0 :(得分:3)

经过很长时间后,继续寻找最佳答案。我发现Elnur Abdurrakhimov的答案是最好的(在我看来,以及我的用例)。

来源https://stackoverflow.com/a/12908748/1617890

use Doctrine\DBAL\Connection;

public function __construct(Connection $connection)
{
    $this->connection = $connection;
}
my_listener:
    arguments: [ @database_connection ]

答案 1 :(得分:2)

您可以从EntityRepository类的$ _em属性到达连接,所以这是您可以这样做的方式;

$connection = $this->_em->getConnection();

答案 2 :(得分:0)

在Doctrine ORM中{p> EntityRepository is built internally。您仍然可以定义自己的服务,也可以是存储库,然后使用该服务。这是ORM的限制,因为Doctrine不在内部使用服务位置或依赖注入容器。

答案 3 :(得分:-1)

问题是你没有传递正确的Connection实例,试试这个:

use Doctrine\DBAL\DriverManager;

class DocumentRepository extends EntityRepository 
{

    protected $conn;

    public function __construct($em, $class)
    {
        $this->conn = $this->myHandleConnection();
         parent::__construct($em,$class);
    }

    public function myHandleConnection()
    {
        $config = new \Doctrine\DBAL\Configuration();
        $connectionParams = array(
                'dbname' => 'MY_DB',
                'user' => 'root',
                'password' => 'root',
                'host' => 'localhost',
                'driver' => 'pdo_mysql',
                'charset' => 'utf8',
                );
        $conn = DriverManager::getConnection($connectionParams, $config);
        return $conn;
    }
}