How to get response as json format(application/json) in yii?

后端 未结 8 979
小鲜肉
小鲜肉 2021-01-30 05:08

How to get response as json format(application/json) in yii?

相关标签:
8条回答
  • 2021-01-30 05:32

    one more simple way by using

    echo CJSON::encode($result);
    

    example code:

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

    cheers :)

    0 讨论(0)
  • 2021-01-30 05:40
    Yii::app()->end()
    

    I think this solution is not the best way to end application flow, because it uses PHP's exit() function, witch means immediate exit from execution flow. Yes, there is Yii's onEndRequest handler, and PHP's register_shutdown_function but it still remains too fatalistic.

    For me the better way is this

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

    So, the application flow continues to execute even after.

    0 讨论(0)
  • 2021-01-30 05:46

    For Yii 1:

    Create this function in your (base) Controller:

    /**
     * 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();
    }
    

    Then simply call at the end of your action:

    $this->renderJSON($yourData);
    

    For Yii 2:

    Yii 2 has this functionality built-in, use the following code at the end of your controller action:

    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    return $data;
    
    0 讨论(0)
  • 2021-01-30 05:50
    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');
        }
    
    }
    
    0 讨论(0)
  • 2021-01-30 05:53

    For Yii2 inside a controller:

    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;
    }
    
    0 讨论(0)
  • 2021-01-30 05:54
    $this->layout=false;
    header('Content-type: application/json');
    echo json_encode($arr);
    Yii::app()->end(); 
    
    0 讨论(0)
提交回复
热议问题