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

2023-12-30

我目前正在开发 Symfony2 项目。在大多数情况下,它是完全标准的;我正在使用 ORM 层通过我的实体与数据库进行交互。那里没有问题。

但是,我确实需要对系统其他地方的现有模式中的一小部分表进行不频繁的查询,其中包含我所说的“参考”信息:诸如货币兑换率之类的信息。我有SELECT只能访问此模式。

我设置了另一个连接,并且一直下降到 DBAL 层来对此架构进行查询,到目前为止,该架构运行得很好。

我的问题是,虽然不常见,但我认为我需要在应用程序的多个位置重复一些 DBAL 查询;我想将这些查询重构到某种存储库中,在那里它们更容易使用/测试/等。我考虑过为表创建实体,但我觉得在这种情况下这有点矫枉过正。我认为您需要实体来创建存储库是否正确?

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

谢谢! 达拉


Update

2013-10-03

请原谅我编辑一个两年前的答案......然而,有几个人质疑现有的方法,虽然它有效(并且对于我的特定用例来说工作得很好),但定义服务当然是交响乐方式.

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

原答案保留如下。

1. 创建额外的DBAL连接

  • 创建连接foo in app/config/config.yml.
  • 争论wrapper_class在这种情况下不需要(参见原始答案)。
doctrine:
    dbal:
        connections:
            default:
                driver:   %database_driver%
                host:     %database_host%
                dbname:   %database_name%
                user:     %database_user%
            foo:
                driver:   %foo_driver%
                host:     %foo_host%
                dbname:   %foo_name%
                user:     %foo_user%

2.配置服务

  • 假设 YAML 格式。
  • 添加配置到src/Acme/TestBundle/Resources/config/services.yml.
  • 注意,我们正在注入上面定义的 DBALfoo_connection进入服务。
services:
    foo_query_service:
        class: Acme\TestBundle\Services\FooQueryService
        arguments:
            - @doctrine.dbal.foo_connection

3.为配置的服务创建类

  • 创建以下类src/Acme/TestBundle/Services/FooQueryService.php:
<?php

namespace Acme\TestBundle\Services;

use DateTime;
use Doctrine\DBAL\Connection;

class FooQueryService
{
    private $connection;

    public function __construct(Connection $connection)
    {
        $this->connection = $connection;
    }

    public function findBarByDate(DateTime $date)
    {
        $stmt = $this->connection->prepare('SELECT * FROM bar WHERE date = :date');
        $stmt->bindValue('date', $date, 'datetime');
        $stmt->execute();

        return $stmt->fetch();
    }
}

4. 最后,在任何需要的地方使用您的查询!

例如,在控制器中...

/**
 * @Route("/", name="home")
 * @Template()
 */
public function indexAction()
{
    $date = new \DateTime();

    $result = $this->get('foo_query_service')
        ->findBarByDate($date);

    return array();
}

完成:)感谢Acayra and koskoz以获取他们的反馈。


好吧,我想我找到了一个在这种情况下适合我的解决方案。

实际上,我对创建实体/管理器进行了另一次研究 - 实际上,似乎缺乏将特定实体映射到多个管理器的 Symfony2 文档。在这种情况下,它似乎仍然是一种矫枉过正的方法(并且“参考”模式非常混乱)。

幸运的是,可以为 DBAL 连接指定一个包装类,并将查询抽象为其中的特定方法。

  1. 使用包装类创建额外的 DBAL 连接config.yml:
doctrine:
    orm:
        connections:
            default:
                driver:   %driver%
                host:     %host%
                dbname:   %name%
                user:     %user%
            foo:
                wrapper_class: 'Acme\TestBundle\Doctrine\DBAL\FooConnection'
                driver:   %foo_driver%
                host:     %foo_host%
                dbname:   %foo_name%
                user:     %foo_user%
  1. 在指定的路径创建包装类:
<?php

namespace Acme\TestBundle\Doctrine\DBAL\FooConnection;
use Doctrine\DBAL\Connection;

class FooConnection extends Connection
{
    // custom query...
    public function findBarByDate(\DateTime $date)
    {
        $stmt = $this->prepare('SELECT * FROM bar WHERE date = :date');
        $stmt->bindValue('date', $date, 'datetime');
        $stmt->execute();  

        return $stmt->fetch();
    }
}

请注意,包装类必须扩展\Doctrine\DBAL\Connection.

  1. 在任何需要的地方使用您的查询:
$date   = new \DateTime();
$conn   = $this->getDoctrine()->getConnection('foo');
$result = $conn->findBarByDate($date);

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Symfony2 中组织可重用 DBAL 查询的最佳实践? 的相关文章

  • 上传并 POST 文件到 PHP 页面

    我需要一种上传文件并将其 POST 到 php 页面的方法 php 位于 apache 服务器上 我在我的桌面应用程序中使用这个 C 代码 这是一个c代码的套接字 当我执行程序时 可以得到 文件大小为772906 打开服务器正常 文件大小为
  • WooCommerce 从所有订单中获取项目元

    我正在尝试显示 WooCommerce 插件中所有已完成订单的所有订单项目 带有项目元 我还想将显示限制为仅显示 10 个订单项目 我已经弄清楚如何显示所有订单项目 但无法将数量限制为 10 这是我当前用于显示所有订单项目的代码 args
  • 为什么要使用 XML 解析器?

    I m a somewhat经验丰富的 PHP 脚本编写者 但是我只是专注于解析 XML 和所有这些好东西 我似乎无法理解为什么人们会使用单独的 XML 解析器而不是仅仅使用explode函数 看起来就这么简单 这是我一直在做的事情 假设路
  • 获取AppKernel.php中的parameters.yml参数

    有人知道如何获取 AppKernel php 中的parameters yml 或 dev 吗 我想动态更改 LogGer 变量 mylogsdir 应用程序内核 php this gt rootDir this gt environmen
  • 有没有好的php库可以将html/php文档转换为对象

    我看到很多可以解析 html 的 php 库 一个很好的例子是查询路径 http querypath org 它模仿 Jquery Api 不过 我想分析一下phtml 因此 该库不仅擅长分析 DOM 而且还擅长分析php处理指令 http
  • PHP - 可以将成员函数分配给变量吗? [复制]

    这个问题在这里已经有答案了 在 PHP5 中 变量可以作为函数进行计算1 http php net manual en functions variable functions php例如 function myFunc echo what
  • 如何循环并访问多维且关联的数组中的各个元素? PHP,JSON 或 XML

    我正在通过 API zotero org 检索书目数据 它与底部的示例类似 只是更复杂 示例是键入的 我想检索一条或多条记录并在页面上显示某些值 例如 我想循环遍历每个顶级记录并以格式良好的引文打印数据 暂时忽略正确的围兜样式 假设我只想为
  • Magento 开源 2.3 - CSS 和 JS 未加载

    I installed Magento 2 3 successfully but when type http localhost Magento2 http localhost Magento2 I get a blank page li
  • 如何正确使用 Bearer 代币?

    我正在制作一个授权系统PHP 我遇到了传递 JWT 令牌的承载方案 我阅读了 RFC 6750 1 我有以下疑问 这如何提高安全性 成功授权和登录后 服务器在其主体中使用 JWT 令牌响应客户端 现在当客户端发出另一个请求时 我不清楚如何实
  • 如何使用 DbSession 在 Yii2 中创建用户会话管理系统 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 今天 当我想为我的网站创建用户个人资料页面并希望创建系统用户可以管理他在此系统中的活动会话时 需要 查看活动会话 浏览器和平台 查看当
  • 仅当客户尚未使用优惠券时,才将优惠券添加到处理订单电子邮件中

    我发现了这个片段 它在订单邮件中添加了优惠券 我想仅当客户未使用任何优惠券时才将其显示在处理订单邮件中 add action woocommerce email before order table add content 20 funct
  • WordPress 中的多词搜索不显示搜索结果

    我自定义了一个主题 但在使用多词查询的搜索结果时遇到一些问题 网站上线时间为www aetterworldbydesign com http abetterworldbydesign com 搜索单个单词 http www abetterw
  • PHP Remedy API 调用创建带有附件的条目不起作用(使用 Postman Works!)

    当我尝试创建带有 PDF 附件的条目时 我已经为此工作了好几天 但没有成功 使用补救 REST API 我每次都会收到超时错误 500 或错误请求 这是文档 https docs bmc com docs ars2002 example o
  • PHP 数组比较

    如何比较两个数组 例如我有array a b c and array a c b 当它们进行比较时 它会返回 true 但如果其中一个字母没有在其中之一中找到 它将返回 false 顺序并不重要 在比较之前 您需要将两个数组的内容调整为相同
  • 尝试加载 php_oci8.dll 时 PHP 启动时出现警告

    我正在使用 XAMPP 并尝试为 sql 配置 Oracle 连接 我取消了该行的注释extension php oci8 dll一开始出现错误 缺少oci dll 但后来我从Oracle网页下载了instantclient 我尝试过版本
  • 如何从 PHP 中的两个不同数组获取公共值

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有两个带有一些用户 ID 的数组 array1 array 5 26 38 42 array2 array 15 36 38 42 我需
  • Codeigniter 错误:不允许您尝试上传的文件类型

    如果我上传一个csv文件 没有问题localhost一切工作正常 但是当我在实时服务器上上传我的应用程序并上传csv文件然后抛出此错误 The filetype you are attempting to upload is not all
  • UNION SELECT - 循环?还是单个查询?

    如果我使用 UNION 从数据库中进行多个 SELECT 是否被视为一个查询 或多个查询 SELECT column name s FROM table1 UNION SELECT column name s FROM table2 这是否
  • 发帖到 FB 粉丝专页时如何解决“不支持的发帖请求”?

    我有一个可以执行 ff 的脚本 发布指向用户时间线 墙的链接 以管理员身份发布指向用户页面的链接 发布到用户的个人资料页面工作正常 然而 发布到粉丝页面的行为很奇怪 我我能够发帖但我回来了 不支持的发布请求 错误 我已经搜索过这个问题并尝试
  • Laravel 搜索路由和控制器

    我正在构建我的第一个基本 Laravel Web 应用程序 在学习了一些教程之后 这是我自己修改的第一个应用程序 我在路由到控制器然后获取正确的网址时遇到了一些麻烦 理想情况下 此时我应该只有两条路线 and user 在主页上 您可以通过

随机推荐