¿Cómo conseguir que la respuesta formato JSON (application / json) en yü?

StackOverflow https://stackoverflow.com/questions/2824805

  •  26-09-2019
  •  | 
  •  

Pregunta

Como llegar a la respuesta formato JSON (application / json) en yü?

¿Fue útil?

Solución

Para Yii 1:

Crear esta función en su (base) Controlador:

/**
 * Return data to browser as JSON and end application.
 * @param array $data
 */
protected function renderJSON($data)
{
    header('Content-type: application/json');
    echo CJSON::encode($data);

    foreach (Yii::app()->log->routes as $route) {
        if($route instanceof CWebLogRoute) {
            $route->enabled = false; // disable any weblogroutes
        }
    }
    Yii::app()->end();
}

A continuación, simplemente llame al final de su acción:

$this->renderJSON($yourData);

Para Yii 2:

Yii 2 tiene esta funcionalidad incorporada , utilice el código siguiente en el final de su acción del controlador:

Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return $data;

Otros consejos

$this->layout=false;
header('Content-type: application/json');
echo CJavaScript::jsonEncode($arr);
Yii::app()->end(); 

Para Yii2 interior de un controlador:

public function actionSomeAjax() {
    $returnData = ['someData' => 'I am data', 'someAnotherData' => 'I am another data'];

    $response = Yii::$app->response;
    $response->format = \yii\web\Response::FORMAT_JSON;
    $response->data = $returnData;

    return $response;
}
$this->layout=false;
header('Content-type: application/json');
echo json_encode($arr);
Yii::app()->end(); 
class JsonController extends CController {

    protected $jsonData;

    protected function beforeAction($action) {
        ob_clean(); // clear output buffer to avoid rendering anything else
        header('Content-type: application/json'); // set content type header as json
        return parent::beforeAction($action);
    }

    protected function afterAction($action) {
        parent::afterAction($action);
        exit(json_encode($this->jsonData)); // exit with rendering json data
    }

}

class ApiController extends JsonController {

    public function actionIndex() {
        $this->jsonData = array('test');
    }

}

Una forma más sencilla utilizando

echo CJSON::encode($result);

código de ejemplo:

public function actionSearch(){
    if (Yii::app()->request->isAjaxRequest && isset($_POST['term'])) {
            $models = Model::model()->searchNames($_POST['term']);
            $result = array();
            foreach($models as $m){
                $result[] = array(
                        'name' => $m->name,
                        'id' => $m->id,
                );


            }
            echo CJSON::encode($result);
        }
}

aplausos:)

En la acción del controlador que desea procesar JSON datos, por ejemplo: actionJson ()

public function actionJson(){
    $this->layout=false;
    header('Content-type: application/json');
    echo CJSON::encode($data);
    Yii::app()->end(); // equal to die() or exit() function
}

Yii API

Yii::app()->end()

Creo que esta solución no es la mejor manera de flujo de la aplicación final, ya que utiliza la función de PHP exit(), bruja significa salida inmediata del flujo de ejecución. Sí, hay manejador onEndRequest de Yu, y register_shutdown_function de PHP, pero sigue siendo demasiado fatalista.

Para mí, la mejor manera es esto

public function run($actionID) 
{
    try
    {
        return parent::run($actionID);
    }
    catch(FinishOutputException $e)
    {
        return;
    }
}

public function actionHello()
{
    $this->layout=false;
    header('Content-type: application/json');
    echo CJavaScript::jsonEncode($arr);
    throw new FinishOutputException;
}

Por lo tanto, el flujo de la aplicación sigue ejecutándose incluso después.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top