请求处理 - 响应组件 ¶
作者: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;
}
两个要点:
data设置为可以被json_encode的数字(一个字符串也能json_encode)
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组件了