我正在尝试为在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);
}
}
我如何获得响应数据......
答案 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();
}
}