Я пытаюсь создать Регистратор запросов и ответов для веб-службы, созданной в 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);
}
}
Как я могу получить данные ответа, а также …
Согласно руководству 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();
}
}
Других решений пока нет …