I have new solution:
return [
// ...
'components' => [
'response' => [
'format' => yii\web\Response::FORMAT_JSON,
'charset' => 'UTF-8',
'class' => 'yii\web\Response',
'on beforeSend' => function ($event) {
$response = $event->sender;
// exception with http code != 200 and 302
if ($response->statusCode !== 200 && $response->statusCode !== 302) {
$response->data = [
'success' => $response->isSuccessful,
'message' => YII_DEBUG ?$response->data: 'System error'
];
$response->statusCode = 200;
}
// normal response
else{
// both case: controller implement Controller or ActiveController
$result = [
'success' => isset($response->data['success'])?$response->data['success']: true
];
// check message is set
if (isset($response->data['message'])){
$result = array_merge($result, ['message' => $response->data['message']]);
}
else{
// check data is set
// both case: controller implement Controller or ActiveController
if (isset($response->data['data']))
$result = array_merge($result, ['data' => $response->data['data']]);
else{
$result = array_merge($result, ['data' => $response->data]);
}
}
$response->data = $result;
$response->statusCode = 200;
}
},
]
],
];