我正在尝试将默认的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行
你可以帮帮我吗?
答案 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)
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;
}
}