Php 在Symfony2中组织可重用DBAL查询的最佳实践?

Php 在Symfony2中组织可重用DBAL查询的最佳实践?,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我现在正在做一个Symfony2项目。在大多数情况下,它完全是标准的;我使用ORM层通过我的实体与数据库接口。没问题 但是,我确实需要对系统中其他地方现有模式中的少数表进行不频繁的查询,这些表包含我称之为“参考”的信息:货币兑换率等。我只有SELECT权限访问此架构 我建立了另一个连接,我一直在访问DBAL层,对这个模式进行查询,到目前为止,这个模式运行得非常好 我的问题是,虽然很少,但我认为我需要在我的应用程序中的多个地方重复一些DBAL查询;我想将这些查询重构成某种类型的存储库,在那里它们更

我现在正在做一个Symfony2项目。在大多数情况下,它完全是标准的;我使用ORM层通过我的实体与数据库接口。没问题

但是,我确实需要对系统中其他地方现有模式中的少数表进行不频繁的查询,这些表包含我称之为“参考”的信息:货币兑换率等。我只有
SELECT
权限访问此架构

我建立了另一个连接,我一直在访问DBAL层,对这个模式进行查询,到目前为止,这个模式运行得非常好

我的问题是,虽然很少,但我认为我需要在我的应用程序中的多个地方重复一些DBAL查询;我想将这些查询重构成某种类型的存储库,在那里它们更容易使用/测试/等等。我曾考虑过为表创建实体,但我觉得在这种情况下这样做太过分了。我认为您需要实体来创建存储库,对吗

相反,我想知道是否有一种“Symfony方法”可以做到这一点?漂亮优雅的东西:)

谢谢! Darragh

更新 2013-10-03

请原谅我编辑了一个两年前的答案。。。然而,有几个人对现有的方法提出了质疑,尽管它很有效(并且对于我的特定用例来说效果很好),但定义服务当然是Symfony方式

没有人提供示例,因此,为了参考/完整性,我将更新我的答案。我必须承认,当我最初发布这个答案时,我对定义定制服务并不太熟悉,但我们生活和学习

原始答案保留在下面

1.创建额外的DBAL连接
  • app/config/config.yml
    中创建连接
    foo
  • 在这种情况下,参数
    wrapper\u class
    不是必需的(参见原始答案)
原则:
dbal:
连接:
违约:
驱动程序:%1数据库\u驱动程序%
主机:%database\u主机%
数据库名称:%database\u name%
用户:%database\u用户%
傅:
驱动程序:%foo\u驱动程序%
主机:%foo\u主机%
数据库名:%foo\u名称%
用户:%foo\u用户%
2.配置服务
  • 采用YAML格式
  • 将配置添加到
    src/Acme/TestBundle/Resources/config/services.yml
  • 注意,我们正在将上面定义的DBAL
    foo_连接
    注入到服务中
服务:
foo_查询服务:
类:Acme\TestBundle\Services\fookeryservice
论据:
-@doctrine.dbal.foo_连接
3.为配置的服务创建类
  • src/Acme/TestBundle/Services/fookeryservice.php
    中创建以下类:

哇,你的答案意味着你对每个表的所有查询都在相同的位置

我不喜欢这种包装的东西,我更喜欢服务。每个表或每个包一个服务,这取决于您是否有很多表以及您希望如何组织查询


然后,我将所需的连接作为服务的参数传递,仅此而已。

感谢您发布本文。我正在努力解决同样的问题,但根据您的回答,让自定义SQL查询依赖于连接似乎不是很干净(除非查询本质上是非常全局的)。另一种方法是创建一个接收dbal连接并管理查询的服务。当然!我希望看到一个好的选择;请随意分享:)上述方法正是我当时能找到的最快的合适解决方案。所以可能没那么干净。嗨,科斯科。我不认为我的回答具体暗示了这一点。最初的解决方案适合我的用例,并且对我来说效果很好。我的应用程序中调用的通用查询非常少,因此需要在容易调用的地方定义它们。我同意在许多情况下,服务是一种更可取的方法,但是,由于你是第二个提出这一点的人,我更新了我最初的答案。从一个使用示例来看,它们都非常干净,但我同意服务方法更通用(这很好)。