Yii2: Регистратор запросов и ответов веб-сервиса

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

В основном мой мотив — отслеживать все запросы, данные запросов, данные ответов, и для этой цели я использую Yii Events. До сих пор я закодировал что-то вроде этого:

Контроллер пользователя

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 методу static моего LogHandler. Однако в моем обработчике я могу получить необработанное тело запроса, но не могу получить данные ответа, которые возвращает actionDemo().

Обработчик логов

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

}

Как мне получить данные ответа...


person Sagar Guhe    schedule 13.08.2015    source источник
comment
Привет... В основном я говорю о своем собственном магазине, но вы смотрели на yii2-audit? Это бесплатно, основано на компоненте отладки и очень тщательно   -  person Blizz    schedule 13.08.2015
comment
@Blizz спасибо, что познакомили меня с yii2-аудитом, мне нужно проверить и протестировать это расширение, в данный момент я не уверен, поможет ли этот инструмент мне выполнить мою задачу или нет. Я вернусь после тестирования.   -  person Sagar Guhe    schedule 14.08.2015
comment
Я только что проверил демонстрационный сайт. Он выглядит так же, как yii-debugger, но он представляет данные более понятным способом, но также не регистрирует содержимое ответа, предоставленное запрашивающему: (   -  person Sagar Guhe    schedule 14.08.2015
comment
Это можно легко добавить, добавив свою собственную панель. Я думаю, если это не сработает для вас, вы можете украсть то, что вам нужно, чтобы заставить его делать то, что вы хотите. В конце концов, это с открытым исходным кодом :)   -  person Blizz    schedule 14.08.2015


Ответы (1)


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

Поскольку доступ к этому классу осуществляется после жизненного цикла запроса, у вас будут данные запроса и ответа Yii::$app->request и Yii::$app->response. strong>, и вы можете получить к ним доступ, чтобы создать любое сообщение, которое вы хотите. Это пример класса 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();
    }

}
person mrateb    schedule 19.11.2018