Zdefiniowałem niestandardową klasę odpowiedzi i próbowałem użyć jej w module.Moduł niestandardowej odpowiedzi Yii2 klasy
W akcji kontrolera zwracam tablicę wyników, ale niestandardowa klasa odpowiedzi nie jest używana.
Zamiast klasa używany jest domyślny Yii \ web \ Response
Moja implementacja
Konfiguracja modułu w config/web.php:
'mymodule' => [
'class' => 'app\modules\mymod\Mymod',
'components' => [
'response' => [
'class' => 'app\modules\mymod\components\apiResponse\ApiResponse',
'format' => yii\web\Response::FORMAT_JSON,
'charset' => 'UTF-8',
],
],
],
W regulatorze i zmodyfikowano metodę zachowań:
public function behaviors() {
$behaviors = parent::behaviors();
$behaviors['contentNegotiator'] = [
'class' => 'yii\filters\ContentNegotiator',
'response' => $this->module->get('response'),
'formats' => [ //supported formats
'application/json' => \yii\web\Response::FORMAT_JSON,
],
];
return $behaviors;
}
W akcji czy zrobić:
public function actionIndex() {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$dataList = [
['id' => 1, 'name' => 'John', 'surname' => 'Davis'],
['id' => 2, 'name' => 'Marie', 'surname' => 'Baker'],
['id' => 3, 'name' => 'Albert', 'surname' => 'Bale'],
];
return $dataList;
}
uzyskać ten wynik (jak oczekiwano od Yii \ web \ Response):
[
{
"id": 1,
"name": "John",
"surname": "Davis"
},
{
"id": 2,
"name": "Marie",
"surname": "Baker"
},
{
"id": 3,
"name": "Albert",
"surname": "Bale"
}
]
Ale jeśli mogę zmienić działanie to:
$dataList = [
['id' => 1, 'name' => 'John', 'surname' => 'Davis'],
['id' => 2, 'name' => 'Marie', 'surname' => 'Baker'],
['id' => 3, 'name' => 'Albert', 'surname' => 'Bale'],
];
//return $dataList;
$resp = $this->module->get('response'); //getting the response component from the module configuration
$resp->data = $dataList;
return $resp;
następnie uzyskać oczekiwany wynik, który brzmi następująco:
{
"status": {
"response_code": 0,
"response_message": "OK",
"response_extra": null
},
"data": [
{
"id": 1,
"name": "John",
"surname": "Davis"
},
{
"id": 2,
"name": "Marie",
"surname": "Baker"
},
{
"id": 3,
"name": "Albert",
"surname": "Bale"
}
]}
Wygląda na to, że określone przeze mnie zachowania nic nie robią.
Co należy zrobić, aby po prostu zwrócić tablicę w działaniu i używany jest niestandardowy komponent odpowiedzi?
góry dzięki
Tak, ja nie chce zastąpić składnik reakcji aplikacji za pośrednictwem modułu. Wystarczy użyć niestandardowego komponentu odpowiedzi w module. Dziękujemy! – Jepi
@Jepi następnie użyj pierwszej opcji. Jeśli zastąpisz komponent odpowiedzi aplikacji funkcją 'init' modułu, wpłynie to tylko na twój moduł. Aby zastąpić jakiś komponent w całej aplikacji (należy uwzględnić inne komponenty), należy dokonać wymiany w ładowaniu początkowym – oakymax
@Jepi Miałem na myśli, że aplikacja nadrzędna może już mieć swoją implementację komponentu odpowiedzi.Na przykład można zainicjować niektóre usługi rejestrowania lub debugowania, które są wspólne dla wszystkich modułów. Zastępując komponent w module, całkowicie blokujesz możliwość dostosowania tego komponentu do modułu w aplikacji nadrzędnej. Więc jeśli spodziewasz się, że twój moduł będzie używany w innych aplikacjach, miej to na uwadze. – oakymax