ventajas tutorial framework ejemplos desventajas advanced php yii2

php - tutorial - Clase de respuesta personalizada del módulo Yii2



yii2 install (1)

Definí una clase de respuesta personalizada e intentaba usarla en un módulo.

En la acción del controlador devuelvo una matriz de resultados, pero no se usa la clase de respuesta personalizada.

En cambio, la clase utilizada es la predeterminada yii / web / Response

Mi implementación

La configuración del módulo en 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'', ], ], ],

En el controlador edité el método de comportamientos:

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

En la acción si lo hago:

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

Obtengo este resultado (como se esperaba de yii / web / Response):

[ { "id": 1, "name": "John", "surname": "Davis" }, { "id": 2, "name": "Marie", "surname": "Baker" }, { "id": 3, "name": "Albert", "surname": "Bale" } ]

Pero si cambio la acción a esto:

$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;

Entonces obtengo el resultado esperado, que es este:

{ "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" } ]}

Parece que los comportamientos que definí no están haciendo nada.

¿Qué debo hacer para devolver la matriz en la acción y usar el componente de respuesta personalizado?

Gracias por adelantado


yii/base/Module no tiene componente de respuesta, por lo que su configuración no funcionará. En lugar de agregar un componente de response en su módulo, debería cambiar Yii::$app->response dentro de la función MyMod::init() .

Si quiere reemplazar completamente Yii::$app->response por su propio componente:

public function init() { parent::init(); /Yii::configure(/Yii::$app, [ ''components'' => [ ''response'' => [ ''class'' => ''app/modules/mymod/components/apiResponse/ApiResponse'', ''format'' => yii/web/Response::FORMAT_JSON, ''charset'' => ''UTF-8'', ], ] ]); }

Pero creo que es una mala idea reemplazar completamente el componente de respuesta de la aplicación principal en un módulo. La mejor manera es modificar el comportamiento de respuesta para sus necesidades. Por ejemplo, puede usar EVENT_BEFORE_SEND y crear su propia estructura de datos en respuesta:

public function init() { parent::init(); // you can use ContentNegotiator at the level of module // and remove this behavior declaration from controllers /Yii::configure($this, [ ''as contentNegotiator'' => [ ''class'' => ''yii/filters/ContentNegotiator'', // if in a module, use the following IDs for user actions // ''only'' => [''user/view'', ''user/index''] ''formats'' => [ ''application/json'' => Response::FORMAT_JSON, ], ], ]); // you can daclare handler as function in you module and pass it as parameter here /Yii::$app->response->on(Response::EVENT_BEFORE_SEND, function ($event) { $response = $event->sender; // here you can get and modify everything in current response // (data, headers, http status etc.) $response->data = [ ''status'' => ''Okay'', ''data'' => $response->data ]; }); }