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

时间:2015-08-13 14:06:28

标签: php yii2 yii2-basic-app

我正在尝试为在Yii 2.0.5中创建的Web服务创建请求和响应记录器以进行调试。

基本上我的动机是跟踪所有请求,请求数据,响应数据,为此我正在使用Yii Events。到目前为止,我编写了类似的内容:

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;
    }

}

在上面的代码中,如果您注意到,那么我已经使用了类级事件处理程序(doc)。在这里,我尝试捕获Controllers EVENT_AFTER_ACTION事件并传递Request& Response {}反对我的LogHandler static方法。但是在我的处理程序中,我能够获取请求的原始主体,但是我无法获得actionDemo()正在返回的响应数据。

LogHandler

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);
    }

}

我如何获得响应数据......

1 个答案:

答案 0 :(得分:1)

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

由于在请求的生命周期之后访问了此类,因此您将获得请求和响应数据 Yii :: $ app->请求 Yii :: $ app->回复,您就可以访问它们以创建所需的任何消息。这是LogHandler类的示例(可以对其进行编辑以包含您想要的有关请求和响应的任何详细信息)

namespace app\models;

use yii\db\ActiveRecord;

class LogHandler extends ActiveRecord {
    $requestPath;
    $responseBody;

    public static function tableName() {
        return 'request_log';
    }    
}

记录器类的示例如下:

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();
    }

}