CodeIgniter4:如何在发送 HTTP 请求和接收 HTTP 响应之间执行 MySQL 查询

问题描述 投票:0回答:1
  1. 开始。
  2. HTTP 请求。
  3. 执行 SQL 查询。
  4. HTTP 响应。

我想获取请求和响应之间的查询(有多少查询和原始 SQL 查询)。

->getLastQuery()
仅返回 1 个最后查询。我想保存发送 HTTP 请求和接收 HTTP 响应之间的所有查询。

我失败的例子;

<?php

class Logger implements FilterInterface
{
    use ResponseTrait;

    public function before(RequestInterface $request, $arguments = null)
    {

    }

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
        $this->db = \Config\Database::connect();
        $this->db->getLastQuery()->getOriginalQuery();
        if ($this->db->getLastQuery()->isWriteType()) {
            echo "updated or write query";
        }
        $return = $this->db->getLastQuery()->getOriginalQuery();
        $logger = new Client();
        $logger->logQueries($return);
    }
}

php codeigniter activerecord codeigniter-4
1个回答
1
投票

说明

尝试使用调试工具栏调试工具栏提供有关当前页面请求的概览信息,包括基准测试结果、已运行的查询、请求和响应数据等。


或者,您可以通过订阅

DBQuery
事件来执行应用程序。这可以通过注册
app/Config/Events.php
类来完成,让它知道您想要在触发该事件时执行操作。

定义事件

大多数事件都在

app/Config/Events.php
文件中定义。你 可以使用
Events
类’
on()
订阅事件的操作 方法。第一个参数是要订阅的事件的名称。 第二个参数是一个可调用的,当该事件发生时将运行 触发:

<?php

use CodeIgniter\Events\Events;

Events::on('pre_system', ['MyClass', 'myFunction']);

在此示例中,每当执行 pre_system 事件时,都会出现一个 创建

MyClass
的实例并运行
myFunction()
方法。 注意第二个参数可以是任何形式 可调用 PHP 识别:

<?php

// Call a standalone function
Events::on('pre_system', 'some_function');

// Call on an instance method
$user = new User();
Events::on('pre_system', [$user, 'someMethod']);

// Call on a static method
Events::on('pre_system', 'SomeClass::someMethod');

// Use a Closure
Events::on('pre_system', static function (...$params) {
    // ...
});

解决方案

在您的

app/Config/Events.php
课程中,订阅
DBQuery
活动。

DBQuery
-:在数据库查询成功与否后调用。接收
\CodeIgniter\Database\Query
对象。
- 事件点


Events::on("DBQuery", static function (\CodeIgniter\Database\Query $query) {

    // Add your SQL query logging logic here. I.e:
    log_message("error", $query->getQuery());

});
© www.soinside.com 2019 - 2024. All rights reserved.