使用 symfony 3 在服务中注入教义 dbal

Posted

技术标签:

【中文标题】使用 symfony 3 在服务中注入教义 dbal【英文标题】:Inject doctrine dbal in service with symfony 3 【发布时间】:2016-06-02 07:38:48 【问题描述】:

我会尽量清楚:我需要在我的一个存储库中使用 SQL。我在互联网上读到我必须使用 Doctrine 的 DBAL 才能使其工作。我在这里举了一个例子: How do you access Doctrine DBAL in a Symfony2 service class? 或那里http://inchoo.net/dev-talk/doctrine-dbal-with-symfony2/

这是我的repo

class myRepository

    private $conn;

    public function __construct(Connection $conn)
        $this->conn = $conn;
    

    public function getStuff()
        $sql = "SELECT * FROM stuff";
        return $this->conn->fetchAll($sql);
    

问题出在构造函数中的 $conn 参数上。 我正在尝试获取 DBAL\connection 对象并获取 EntityManager。

这是我的 Bundle/Resources/config/services.yml

services:
    my_repo:
    class: MyBundle\Repository\MyRepository
    arguments: ["@doctrine.dbal.default_connection"]

app/config.yml 学说部分:

doctrine:
dbal:
    default_connection: default
    connections:
        default:
            driver:   pdo_mysql
            host:     "%database_host%"
            port:     "%database_port%"
            dbname:   "%database_name%"
            user:     "%database_user%"
            password: "%database_password%"
            charset:  UTF8

最后,错误

可捕获的致命错误:传递给 MyBundle\Repository\MyRepository::__construct() 的参数 1 必须是 Doctrine\DBAL\Connection 的实例,给定的 Doctrine\ORM\EntityManager 实例,在 D:\dev\php\ 中调用MyProject\vendor\doctrine\orm\lib\Doctrine\ORM\Repository\DefaultRepositoryFactory.php 在第 68 行并定义了 500 Internal Server Error - ContextErrorException

有人知道这个错误,以及如何解决它吗?

注意:我已经尝试不在 app/config.yml 中命名我的连接,因为我猜它应该为多个连接保留。我还尝试使用“@database_connection”作为我的 repo 构造函数的参数,还尝试了“@doctrine.dbal”,而我的连接没有命名。

Nb2:如果需要,这是我的 composer.json 的一部分

"doctrine/orm": "^2.5",
"doctrine/doctrine-bundle": "^1.6",

【问题讨论】:

【参考方案1】:

好的,我会回答自己:我不知道问题出在哪里,知道这仍然很有趣,但设法以另一种(更简单)的方式做到了:

class MyRepo extends \Doctrine\ORM\EntityRepository


    public function findAllServices()
        $sql = "SELECT * FROM stuff";
        return $this->getEntityManager()->getConnection()->fetchAll($sql);
    

我认为我必须使用 DBAL,因为我认为这是使用普通旧 sql 请求进行查询的唯一方法……但事实并非如此。

【讨论】:

很高兴您可以使用它,但您的原始设置应该可以使用。看不出你怎么可能得到一个 em 注入而不是 dbal 连接。您实际上是从容器中拉出 my_repo 吗?几乎看起来您正在使用 new 运算符。 不,任何地方都没有。除了我在这里展示的东西,我什么也没做。我的控制器只是调用我的 repo 的方法。我只想使用 services.yml 注入 抽象层,所以我没有编写任何 php 代码,而是我的 Repo 中的代码。但是关于我对自己的回答,我对尝试过所有这些“复杂性”感到有点愚蠢,而我本可以在一条 php 行中完成它。 很公平。我不认为您有任何机会使用“@database_connection”而不是“@doctrine.dbal.default_connection”?我知道这并不重要,但是如果您坚持使用直接 sql,那么您实际上并不需要实体管理器或从 EntityRepository 扩展。只是在一个无聊的下午有点神秘。 我都试过了,都没有用。无论如何,只要我能继续工作,我可以接受 symfony 做一些超出我技能的巫术:D

以上是关于使用 symfony 3 在服务中注入教义 dbal的主要内容,如果未能解决你的问题,请参考以下文章

如何在 symfony 2 和教义 2 中自定义 sql 日志?

如何使用 symfony 在教义查询构建器中选择表之间的特定连接?

如何在 symfony WebTestCase 的测试中按夹具类型获取教义夹具参考?

Symfony2 - 奏鸣曲 Datagrid 过滤器操作符转换为教义_orm_class 字段失败

如何使用教义/symfony4 从数据库中获取(连接)两条记录

Symfony:通过控制器更新外键的教义