Yii2: регистратор запросов и ответов веб-службы

Я пытаюсь создать Регистратор запросов и ответов для веб-службы, созданной в Yii 2.0.5 для целей отладки.

По сути, мой мотив — отслеживать все запросы, данные запросов, данные ответов, и для этого я использую 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;
}

}

В приведенном выше коде, если вы заметили, я использовал обработчик событий уровня класса (доктор). Здесь я пытаюсь захватить Controllers EVENT_AFTER_ACTION событие и прохождение Request & Response возражать против моего LogHandler«s 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);
}

}

Как я могу получить данные ответа, а также …

4

Решение

Согласно руководству Yii Вот, лучший способ создать компонент регистратора — переопределить класс yii \ log \ Target. Затем для отправки логов необходимо переопределить абстрактный метод экспорт () этого класса

Поскольку этот класс доступен после жизненного цикла запроса, у вас будут данные запроса и ответа 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();
}

}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]