Php Yii2:Web服务请求和响应记录器

Php Yii2:Web服务请求和响应记录器,php,yii2,yii2-basic-app,Php,Yii2,Yii2 Basic App,我正在尝试为在Yii 2.0.5中创建的web服务创建一个请求和响应记录器,以便进行调试 基本上,我的动机是跟踪所有请求、请求数据和响应数据,为此,我使用Yii事件。到目前为止,我已经编写了如下代码: UserController use yii\rest\ActiveController; use yii\base\Event; use yii\web\Response; Event::on(ActiveController::className(), ActiveController::E

我正在尝试为在Yii 2.0.5中创建的web服务创建一个请求和响应记录器,以便进行调试

基本上,我的动机是跟踪所有请求、请求数据和响应数据,为此,我使用Yii事件。到目前为止,我已经编写了如下代码:

UserController

use yii\rest\ActiveController;
use yii\base\Event;
use yii\web\Response;

Event::on(ActiveController::className(), ActiveController::EVENT_AFTER_ACTION, ['app\models\LogHandler', 'saveRequest'], ['request' => Yii::$app->request->getRawBody(), 'response' => Yii::$app->response->content]);

class UserController extends ActiveController
{

    public $modelClass = 'app\models\User';

    public function behaviors()
    {
        $behaviors = parent::behaviors();

        $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_XML;

        return $behaviors;
    }

    // POST demo
    public function actionDemo()
    {
        $data = array('status' => 200, 'message' => 'Success');
        return $data;
    }

}
namespace app\models;

use yii\db\ActiveRecord;

class LogHandler extends ActiveRecord
{
    public static function tableName()
    {
        return 'request_log';
    }

    public static function saveRequest($event)
    {
//        self::load($event);
//        self::save();
        var_dump($event);
    }

}
在上面的代码中,如果您注意到了,那么我使用了类级别的事件处理程序()。在这里,我试图在动作之后捕获
控制器
事件
并将
请求
响应
对象传递给我的
日志处理程序
静态
方法。但是,在我的处理程序中,我能够获取请求的原始正文,但无法获取
actionDemo()
返回的响应数据

日志处理程序

use yii\rest\ActiveController;
use yii\base\Event;
use yii\web\Response;

Event::on(ActiveController::className(), ActiveController::EVENT_AFTER_ACTION, ['app\models\LogHandler', 'saveRequest'], ['request' => Yii::$app->request->getRawBody(), 'response' => Yii::$app->response->content]);

class UserController extends ActiveController
{

    public $modelClass = 'app\models\User';

    public function behaviors()
    {
        $behaviors = parent::behaviors();

        $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_XML;

        return $behaviors;
    }

    // POST demo
    public function actionDemo()
    {
        $data = array('status' => 200, 'message' => 'Success');
        return $data;
    }

}
namespace app\models;

use yii\db\ActiveRecord;

class LogHandler extends ActiveRecord
{
    public static function tableName()
    {
        return 'request_log';
    }

    public static function saveRequest($event)
    {
//        self::load($event);
//        self::save();
        var_dump($event);
    }

}

如何获得响应数据…

根据Yii指南,创建记录器组件的最佳方法是覆盖类Yii\log\Target。然后,要发送日志,需要重写此类的抽象方法export()

由于该类是在请求的生命周期之后访问的,因此您将拥有请求和响应数据Yii::$app->requestYii::$app->response,并且您可以访问它们来创建所需的任何消息。这是LogHandler类的一个示例(可以对其进行编辑,以包含有关请求和响应的任何详细信息)

记录器类的示例如下所示:

namespace app\components\Logs;

use yii\helpers\VarDumper;
use yii\log\Target;
use Yii;

class LoggerComponent extends Target {

    public function export() {
        $logMessage = new LogHandler();
        $logMessage->requestPath = VarDumper::export(Yii::$app->request->absoluteUrl);
        $logMessage->responseBody = VarDumper::export(Yii::$app->response->data);
        $logMessage->save();
    }

}

你好我说的基本上是我自己的店,但你看过吗?它是免费的,基于调试组件,非常简单thourough@Blizz感谢您向我介绍yii2审计,我需要检查和测试此扩展,目前我不确定此工具是否有助于我完成任务。。测试后我会回来的希望它能满足你的需要。如果您想在不安装的情况下看到它的运行情况,请使用。我刚刚检查了演示站点,它看起来与yii debugger相同,但它以更容易理解的方式表示了数据,但它也不会记录提供给请求者的响应内容:(这可以通过添加您自己的面板轻松添加。我想如果这对您不起作用,您可以自由地窃取您需要的内容,以使其实现您想要的功能。它毕竟是开源的:)