Php Yii2:Web服务请求和响应记录器
我正在尝试为在Yii 2.0.5中创建的web服务创建一个请求和响应记录器,以便进行调试 基本上,我的动机是跟踪所有请求、请求数据和响应数据,为此,我使用Yii事件。到目前为止,我已经编写了如下代码: UserControllerPhp 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
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->request和Yii::$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相同,但它以更容易理解的方式表示了数据,但它也不会记录提供给请求者的响应内容:(这可以通过添加您自己的面板轻松添加。我想如果这对您不起作用,您可以自由地窃取您需要的内容,以使其实现您想要的功能。它毕竟是开源的:)