请求处理 - 响应组件

  • 作者:KK

  • 发表日期:2016.12.11


response组件就是响应组件了

输出字符串

控制器除了可以返回数据给框架来让框架统一输出以外,还可以设置response组件的数据来实现输出:

public function actionTest(){
	Yii::$app->response->data = 'Hello world!';
}

这样就会输出'Hello world!'

其实你还可以执行send方法马上发送

public function actionTest(){
	Yii::$app->response->data;
	
	if(!Yii::$app->response->isSent){
		Yii::$app->response->send();
		echo Yii::$app->response->isSent; //true 
	}
}

默认情况下如果你不send,控制器执行结束后,框架底层会执行send,通常大家都懒得send


输出JSON

public function actionTest(){
	Yii::$app->response->data = pathinfo('/a/b/c.jpg');
	Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
}

两个要点:

  1. data设置为可以被json_encode的数字(一个字符串也能json_encode)

  2. format设置为yii\web\Response::FORMAT_JSON这个常量值

format的默认值是yii\web\Response::FORMAT_HTML


下载文件

Yii::$app->response->sendFile('/a/b/c.jpg', '测试图片.jpg');

于是浏览器就会弹出下载框,提示下载一个叫“测试图片.jpg”的文件


操作header

Yii::$app->response->headers->add('Content-type', 'text/plain');
Yii::$app->response->headers->add('myHeader', 'myValue');
Yii::$app->response->headers->remove('myHeader');
Yii::$app->response->data = print_r([7, 9, 3]);

响应状态码

这回换个花样,通过configure设置吧

Yii::configure(Yii::$app->response, [
	'statusText' => '出错啦',
	'statusCode' => 501, //别占用500,这样就知道500是apache|nginx或框架底层这些出错的,501是咱自己定义的错误
]);
  • 显示404报错

    throw new \yii\web\NotFoundHttpException();
    

    底层会将这个异常转换成404报错


  • 抛出以下异常有其它对应的状态码和提示

    • yii\web\BadRequestHttpException: status code 400

    • yii\web\ConflictHttpException: status code 409

    • yii\web\ForbiddenHttpException: status code 403

    • yii\web\GoneHttpException: status code 410

    • yii\web\MethodNotAllowedHttpException: status code 405

    • yii\web\NotAcceptableHttpException: status code 406

    • yii\web\NotFoundHttpException: status code 404

    • yii\web\ServerErrorHttpException: status code 500

    • yii\web\TooManyRequestsHttpException: status code 429

    • yii\web\UnauthorizedHttpException: status code 401

    • yii\web\UnsupportedMediaTypeHttpException: status code 415


  • 抛出自定义状态码异常,比如定义个999的状态码

    throw new \yii\web\HttpException(999);
    

重定向

public function actionTest(){
	return $this->redirect('http://www.kkh86.com');
	return $this->redirect('http://www.kkh86.com', 301);
	return $this->redirect('http://www.kkh86.com', 302);
	return $this->redirect('/b.php');

	//用response组件也可以
	return Yii::$app->response->redirect('http://www.kkh86.com');
	return Yii::$app->response->redirect('http://www.kkh86.com', 301);
	return Yii::$app->response->redirect('http://www.kkh86.com', 302);
	return Yii::$app->response->redirect('/b.php');
	
}

在控制器里的话直接调控制器代码最短,不过最后还是调了response来redirect,感觉这个快捷方法营养不多,我还是偏向直接用response组件的

而不在控制器里,比如模型或扩展类什么的地方重定向就要靠response组件了