《PHP编程:解读PHP的Yii框架中请求与响应的处理流程》要点:
本文介绍了PHP编程:解读PHP的Yii框架中请求与响应的处理流程,希望对您有用。如果有疑问,可以联系我们。
相关主题:YII框架
PHP实例一、哀求(Requests)
哀求:
一个应用的哀求是用 yii\web\Request 对象来表示的,该对象提供了诸如 哀求参数(译者注:通常是GET参数或者POST参数)、HTTP头、cookies等信息. 默认情况下,对于一个给定的哀求,你可以通过 request application component 应用组件(yii\web\Request 类的实例) 获得访问相应的哀求对象.在本章节,我们将介绍怎样在你的应用中使用这个组件.
PHP实例1.哀求参数
PHP实例要获取哀求参数,你可以调用 request 组件的 yii\web\Request::get() 方法和 yii\web\Request::post() 方法. 他们分别返回 $_GET 和$_POST 的值.例如,
PHP实例
$request = Yii::$app->request;
$get = $request->get();
// 等价于: $get = $_GET;
$id = $request->get('id');
// 等价于: $id = isset($_GET['id']) ? $_GET['id'] : null;
$id = $request->get('id', 1);
// 等价于: $id = isset($_GET['id']) ? $_GET['id'] : 1;
$post = $request->post();
// 等价于: $post = $_POST;
$name = $request->post('name');
// 等价于: $name = isset($_POST['name']) ? $_POST['name'] : null;
$name = $request->post('name', '');
// 等价于: $name = isset($_POST['name']) ? $_POST['name'] : '';
PHP实例信息:建议你像上面那样通过 request 组件来获取哀求参数,而不是 直接访问 $_GET 和 $_POST. 这使你更容易编写测试用例,因为你可以伪造数据来创建一个模拟哀求组件.
当实现 RESTful APIs 接口的时候,你经常需要获取通过PUT, PATCH或者其他的 request methods 哀求方法提交上来的参数.你可以通过调用 yii\web\Request::getBodyParam() 方法来获取这些参数.例如,
PHP实例
$request = Yii::$app->request;
// 返回所有参数
$params = $request->bodyParams;
// 返回参数 "id"
$param = $request->getBodyParam('id');
PHP实例信息:不同于 GET 参数,POST,PUT,PATCH 等等这些提交上来的参数是在哀求体中被发送的. 当你通过上面介绍的方法访问这些参数的时候,request 组件会解析这些参数. 你可以通过配置 yii\web\Request::parsers 属性来自定义怎样解析这些参数.
PHP实例2.哀求方法
PHP实例你可以通过 Yii::$app->request->method 表达式来获取当前哀求使用的HTTP方法. 这里还提供了一整套布尔属性用于检测当前哀求是某种类型. 例如,
PHP实例
$request = Yii::$app->request;
if ($request->isAjax) { /* 该哀求是一个 AJAX 哀求 */ }
if ($request->isGet) { /* 哀求方法是 GET */ }
if ($request->isPost) { /* 哀求方法是 POST */ }
if ($request->isPut) { /* 哀求方法是 PUT */ }
PHP实例3.哀求URLs
PHP实例request 组件提供了许多方式来检测当前哀求的URL.
PHP实例假设被哀求的URL是 http://example.com/admin/index.php/product?id=100, 你可以像下面描述的那样获取URL的各个部分:
PHP实例4.HTTP头
PHP实例你可以通过 yii\web\Request::headers 属性返回的 yii\web\HeaderCollection 获取HTTP头信息. 例如,
PHP实例
// $headers 是一个 yii\web\HeaderCollection 对象
$headers = Yii::$app->request->headers;
// 返回 Accept header 值
$accept = $headers->get('Accept');
if ($headers->has('User-Agent')) { /* 这是一个 User-Agent 头 */ }
PHP实例哀求组件也提供了支持快速访问常用头的方法,包括:
PHP实例假如你的应用支持多语言,并且你想在终端用户最喜欢的语言中显示页面,那么你可以使用语言协商方法 yii\web\Request::getPreferredLanguage(). 这个方法通过 yii\web\Request::acceptableLanguages 在你的应用中所支持的语言列表里进行比较筛选,返回最适合的语言.
PHP实例提示:你也可以使用 yii\filters\ContentNegotiator 过滤器进行动态确定哪些内容类型和语言应该在响应中使用. 这个过滤器实现了上面介绍的内容协商的属性和办法.
PHP实例5.客户端信息
PHP实例你可以通过 yii\web\Request::userHost 和 yii\web\Request::userIP 分别获取host name和客户机的IP地址, 例如,
PHP实例
$userHost = Yii::$app->request->userHost;
$userIP = Yii::$app->request->userIP;
PHP实例二、响应(Responses)
响应:
当应用完成处理一个哀求后, 会生成一个yii\web\Response响应对象并发送给终端用户 响应对象包含的信息有HTTP状态码,HTTP头和主体内容等, 网页应用开发的最终目的本质上就是根据不同的哀求构建这些响应对象.
PHP实例在大多是情况下主要处理继承自 yii\web\Response 的 response 应用组件, 尽管如此,Yii也允许你创建你本身的响应对象并发送给终端用户,这方面后续会阐述.
PHP实例在本节,将会描述如何构建响应和发送给终端用户.
PHP实例1.状态码
PHP实例构建响应时,最先应做的是标识哀求是否成功处理的状态,可通过设置 yii\web\Response::statusCode 属性,该属性使用一个有效的HTTP 状态码.例如,为标识处理已被处理成功, 可设置状态码为200,如下所示:
PHP实例
Yii::$app->response->statusCode = 200;
PHP实例尽管如此,大多数情况下不需要明确设置状态码,因为 yii\web\Response::statusCode 状态码默认为200, 如果需要指定哀求失败,可抛出对应的HTTP异常,如下所示:
PHP实例
throw new \yii\web\NotFoundHttpException;
PHP实例当错误处理器 捕获到一个异常,会从异常中提取状态码并赋值到响应, 对于上述的 yii\web\NotFoundHttpException 对应HTTP 404状态码,以下为Yii预定义的HTTP异常:
PHP实例如果想抛出的异常不在如上列表中,可创建一个yii\web\HttpException异常,带上状态码抛出,如下:
PHP实例
throw new \yii\web\HttpException(402);
PHP实例2.HTTP 头部
PHP实例可在 response 组件中操控yii\web\Response::headers来发送HTTP头部信息,例如:
PHP实例
$headers = Yii::$app->response->headers;
// 增加一个 Pragma 头,已存在的Pragma 头不会被覆盖.
$headers->add('Pragma', 'no-cache');
// 设置一个Pragma 头. 任何已存在的Pragma 头都会被丢弃
$headers->set('Pragma', 'no-cache');
// 删除Pragma 头并返回删除的Pragma 头的值到数组
$values = $headers->remove('Pragma');
PHP实例补充: 头名称是大小写敏感的,在yii\web\Response::send()办法调用前新注册的头信息并不会发送给用户.
PHP实例3.响应主体
PHP实例大多是响应应有一个主体存放你想要显示给终端用户的内容.
PHP实例如果已有格式化好的主体字符串,可赋值到响应的yii\web\Response::content属性,例如:
PHP实例
Yii::$app->response->content = 'hello world!';
PHP实例如果在发送给终端用户之前必要格式化,应设置 yii\web\Response::format 和 yii\web\Response::data 属性,yii\web\Response::format 属性指定yii\web\Response::data中数据格式化后的样式,例如:
PHP实例
$response = Yii::$app->response;
$response->format = \yii\web\Response::FORMAT_JSON;
$response->data = ['message' => 'hello world'];
PHP实例Yii支持以下可直接使用的格式,每个实现了yii\web\ResponseFormatterInterface 类, 可自定义这些格式器或通过配置yii\web\Response::formatters 属性来增加格式器.
PHP实例上述响应主体可明确地被设置,但是在大多数情况下是通过 操作 办法的返回值隐式地设置,常用场景如下所示:
PHP实例
public function actionIndex()
{
return $this->render('index');
}
PHP实例上述的 index 操作返回 index 视图渲染结果,返回值会被 response 组件格式化后发送给终端用户.
PHP实例因为响应格式默认为yii\web\Response::FORMAT_HTML, 只需要在操作办法中返回一个字符串, 如果想使用其他响应格式,应在返回数据前先设置格式,例如:
PHP实例
public function actionInfo()
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return [
'message' => 'hello world',
'code' => 100,
];
}
PHP实例如上所述,触雷使用默认的 response 应用组件,也可创建自己的响应对象并发送给终端用户,可在操作办法中返回该响应对象,如下所示:
PHP实例
public function actionInfo()
{
return \Yii::createObject([
'class' => 'yii\web\Response',
'format' => \yii\web\Response::FORMAT_JSON,
'data' => [
'message' => 'hello world',
'code' => 100,
],
]);
}
PHP实例注意: 如果创建你本身的响应对象,将不能在应用配置中设置 response 组件,尽管如此, 可使用 依赖注入 应用通用配置到你新的响应对象.
PHP实例4.浏览器跳转
PHP实例浏览器跳转依赖于发送一个Location HTTP 头,因为该功能通常被使用,Yii提供对它提供了特别的支持.
PHP实例可调用yii\web\Response::redirect() 办法将用户浏览器跳转到一个URL地址,该办法设置合适的 带指定URL的 Location 头并返回它自己为响应对象,在操作的办法中,可调用缩写版yii\web\Controller::redirect(),例如:
PHP实例
public function actionOld()
{
return $this->redirect('http://example.com/new', 301);
}
PHP实例在如上代码中,操作的办法返回redirect() 办法的结果,如前所述,操作的办法返回的响应对象会被当总响应发送给终端用户.
PHP实例除了操作办法外,可直接调用yii\web\Response::redirect() 再调用 yii\web\Response::send() 办法来确保没有其他内容追加到响应中.
PHP实例
\Yii::$app->response->redirect('http://example.com/new', 301)->send();
PHP实例补充: yii\web\Response::redirect() 方法默认会设置响应状态码为302,该状态码会告诉浏览器哀求的资源 临时 放在另一个URI地址上,可传递一个301状态码告知浏览器哀求的资源已经 永久 重定向到新的URId地址.
如果当前哀求为AJAX 哀求,发送一个 Location 头不会自动使浏览器跳转,为解决这个问题, yii\web\Response::redirect() 方法设置一个值为要跳转的URL的X-Redirect 头, 在客户端可编写JavaScript 代码读取该头部值然后让浏览器跳转对应的URL.
PHP实例补充: Yii 配备了一个yii.js JavaScript 文件提供常用JavaScript功能,包含基于X-Redirect头的浏览器跳转, 因此,如果你使用该JavaScript 文件(通过yii\web\YiiAsset 资源包注册),就不需要编写AJAX跳转的代码.
PHP实例5.发送文件
PHP实例和浏览器跳转类似,文件发送是另一个依赖指定HTTP头的功能,Yii提供办法集合来支持各种文件发送需求,它们对HTTP头都有内置的支持.
PHP实例这些办法都将响应对象作为返回值,如果要发送的文件非常大,应考虑使用 yii\web\Response::sendStreamAsFile() 因为它更节约内存,以下示例显示在控制器操作中如何发送文件:
PHP实例
public function actionDownload()
{
return \Yii::$app->response->sendFile('path/to/file.txt');
}
PHP实例如果不是在操作办法中调用文件发送办法,在后面还应调用 yii\web\Response::send() 没有其他内容追加到响应中.
PHP实例
\Yii::$app->response->sendFile('path/to/file.txt')->send();
PHP实例一些浏览器提供特殊的名为X-Sendfile的文件发送功能,原理为将哀求跳转到服务器上的文件, Web应用可在服务器发送文件前结束,为使用该功能,可调用yii\web\Response::xSendFile(), 如下简要列出一些常用Web服务器如何启用X-Sendfile 功能:
PHP实例
Apache: X-Sendfile
Lighttpd v1.4: X-LIGHTTPD-send-file
Lighttpd v1.5: X-Sendfile
Nginx: X-Accel-Redirect
Cherokee: X-Sendfile and X-Accel-Redirect
PHP实例6.发送响应
PHP实例在yii\web\Response::send() 办法调用前响应中的内容不会发送给用户,该办法默认在yii\base\Application::run() 结尾自动调用,尽管如此,可以明确调用该办法强制立即发送响应.
PHP实例yii\web\Response::send() 办法使用以下步骤来发送响应:
PHP实例一旦yii\web\Response::send() 办法被执行后,其他地方调用该办法会被忽略, 这意味着一旦响应发出后,就不能再追加其他内容.
PHP实例如你所见yii\web\Response::send() 触发了几个实用的变乱,通过响应这些变乱可调整或包装响应.
《PHP编程:解读PHP的Yii框架中请求与响应的处理流程》是否对您有启发,欢迎查看更多与《PHP编程:解读PHP的Yii框架中请求与响应的处理流程》相关教程,学精学透。维易PHP学院为您提供精彩教程。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/7316.html