大佬教程收集整理的这篇文章主要介绍了解读PHP的Yii框架中请求与响应的处理流程,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
要获取请求参数,你可以调用 request 组件的 yii\web\request::get() 方法和 yii\web\request::post() 方法。 他们分别返回 $_GET 和$_POST 的值。例如,
$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'] : '';
信息:建议你像上面那样通过 request 组件来获取请求参数,而不是 直接访问 $_GET 和 $_POST。 这使你更容易编写测试用例,因为你可以伪造数据来创建一个模拟请求组件。 当实现 RESTful APIs 接口的时候,你经常需要获取通过PUT, PATCH或者其他的 request methods 请求方法提交上来的参数。你可以通过调用 yii\web\request::getBodyParam() 方法来获取这些参数。例如,
信息:不同于 GET 参数,POST,PUT,PATCH 等等这些提交上来的参数是在请求体中被发送的。 当你通过上面介绍的方法访问这些参数的时候,request 组件会解析这些参数。 你可以通过配置 yii\web\request::parsers 属性来自定义怎样解析这些参数。
你可以通过 Yii::$app->request->method 表达式来获取当前请求使用的http方法。 这里还提供了一整套布尔属性用于检测当前请求是某种类型。 例如,
if ($request->isAjaX) { / 该请求是一个 AJAX 请求 / }
if ($request->isGet) { / 请求方法是 GET / }
if ($request->isPost) { / 请求方法是 POST / }
if ($request->isPut) { / 请求方法是 PUT / }
request 组件提供了许多方式来检测当前请求的URL。
假设被请求的URL是 http://example.com/admin/index.php/product?id=100, 你可以像下面描述的那样获取URL的各个部分:
你可以通过 yii\web\request::headers 属性返回的 yii\web\HeaderCollection 获取http头信息。 例如,
// 返回 Accept header 值
$accept = $headers->get('Accept');
if ($headers->has('User-Agent')) { / 这是一个 User-Agent 头 / }
请求组件也提供了支持快速访问常用头的方法,包括:
假如你的应用支持多语言,并且你想在终端用户最喜欢的语言中显示页面,那么你可以使用语言协商方法 yii\web\request::getPreferredLanguage()。 这个方法通过 yii\web\request::acceptableLanguages 在你的应用中所支持的语言列表里进行比较筛选,返回最适合的语言。
提示:你也可以使用 yii\filters\ContentNegotiator 过滤器进行动态确定哪些内容类型和语言应该在响应中使用。 这个过滤器实现了上面介绍的内容协商的属性和方法。
你可以通过 yii\web\request::userHost 和 yii\web\request::userIP 分别获取host name和客户机的IP地址, 例如,
在大多是情况下主要处理继承自 yii\web\Response 的 response 应用组件, 尽管如此,Yii也允许你创建你自己的响应对象并发送给终端用户,这方面后续会阐述。
在本节,将会描述如何构建响应和发送给终端用户。
构建响应时,最先应做的是标识请求是否成功处理的状态,可通过设置 yii\web\Response::statusCode 属性,该属性使用一个有效的http 状态码。例如,为标识处理已被处理成功, 可设置状态码为200,如下所示:
尽管如此,大多数情况下不需要明确设置状态码,因为 yii\web\Response::statusCode 状态码默认为200, 如果需要指定请求失败,可抛出对应的http异常,如下所示:
当错误处理器 捕获到一个异常,会从异常中提取状态码并赋值到响应, 对于上述的 yii\web\NotFoundhttpException 对应http 404状态码,以下为Yii预定义的http异常:
如果想抛出的异常不在如上列表中,可创建一个yii\web\httpException异常,带上状态码抛出,如下:
可在 response 组件中操控yii\web\Response::headers来发送http头部信息,例如:
// 增加一个 Pragma 头,已存在的Pragma 头不会被覆盖。
$headers->add('Pragma','no-cache');
// 设置一个Pragma 头. 任何已存在的Pragma 头都会被丢弃
$headers->set('Pragma','no-cache');
// 删除Pragma 头并返回删除的Pragma 头的值到数组
$values = $headers->remove('Pragma');
补充: 头名称是大小写敏感的,在yii\web\Response::send()方法调用前新注册的头信息并不会发送给用户。
大多是响应应有一个主体存放你想要显示给终端用户的内容。
如果已有格式化好的主体字符串,可赋值到响应的yii\web\Response::content属性,例如:
如果在发送给终端用户之前需要格式化,应设置 yii\web\Response::format 和 yii\web\Response::data 属性,yii\web\Response::format 属性指定yii\web\Response::data中数据格式化后的样式,例如:
Yii支持以下可直接使用的格式,每个实现了yii\web\ResponseFormatterInterface 类, 可自定义这些格式器或通过配置yii\web\Response::formatters 属性来增加格式器。
上述响应主体可明确地被设置,但是在大多数情况下是通过 操作 方法的返回值隐式地设置,常用场景如下所示:
上述的 index 操作返回 index 视图渲染结果,返回值会被 response 组件格式化后发送给终端用户。
因为响应格式默认为yii\web\Response::FORMAT_HTML,只需要在操作方法中返回一个字符串, 如果想使用其他响应格式,应在返回数据前先设置格式,例如:
如上所述,触雷使用默认的 response 应用组件,也可创建自己的响应对象并发送给终端用户,可在操作方法中返回该响应对象,如下所示:
注意: 如果创建你自己的响应对象,将不能在应用配置中设置 response 组件,尽管如此, 可使用 依赖注入 应用通用配置到你新的响应对象。
浏览器跳转依赖于发送一个LOCATIOn http 头,因为该功能通常被使用,Yii提供对它提供了特别的支持。
可调用yii\web\Response::redirect() 方法将用户浏览器跳转到一个URL地址,该方法设置合适的 带指定URL的 LOCATIOn 头并返回它自己为响应对象,在操作的方法中,可调用缩写版yii\web\Controller::redirect(),例如:
在如上代码中,操作的方法返回redirect() 方法的结果,如前所述,操作的方法返回的响应对象会被当总响应发送给终端用户。
除了操作方法外,可直接调用yii\web\Response::redirect() 再调用 yii\web\Response::send() 方法来确保没有其他内容追加到响应中。
补充: yii\web\Response::redirect() 方法默认会设置响应状态码为302,该状态码会告诉浏览器请求的资源 临时 放在另一个URI地址上,可传递一个301状态码告知浏览器请求的资源已经 永久 重定向到新的URId地址。 如果当前请求为AJAX 请求,发送一个 LOCATIOn 头不会自动使浏览器跳转,为解决这个问题, yii\web\Response::redirect() 方法设置一个值为要跳转的URL的X-Redirect 头, 在客户端可编写JavaScript 代码读取该头部值然后让浏览器跳转对应的URL。
补充: Yii 配备了一个yii.js JavaScript 文件提供常用JavaScript功能,包括基于X-Redirect头的浏览器跳转, 因此,如果你使用该JavaScript 文件(通过yii\web\YiiAsset 资源包注册),就不需要编写AJAX跳转的代码。
和浏览器跳转类似,文件发送是另一个依赖指定http头的功能,Yii提供方法集合来支持各种文件发送需求,它们对http头都有内置的支持。
这些方法都将响应对象作为返回值,如果要发送的文件非常大,应考虑使用 yii\web\Response::sendStreamAsFile() 因为它更节约内存,以下示例显示在控制器操作中如何发送文件:
如果不是在操作方法中调用文件发送方法,在后面还应调用 yii\web\Response::send() 没有其他内容追加到响应中。
一些浏览器提供特殊的名为X-Sendfile的文件发送功能,原理为将请求跳转到服务器上的文件, Web应用可在服务器发送文件前结束,为使用该功能,可调用yii\web\Response::xSendFile(), 如下简要列出一些常用Web服务器如何启用X-Sendfile 功能:
在yii\web\Response::send() 方法调用前响应中的内容不会发送给用户,该方法默认在yii\base\Application::run() 结尾自动调用,尽管如此,可以明确调用该方法强制立即发送响应。
yii\web\Response::send() 方法使用以下步骤来发送响应:
一旦yii\web\Response::send() 方法被执行后,其他地方调用该方法会被忽略, 这意味着一旦响应发出后,就不能再追加其他内容。
如你所见yii\web\Response::send() 触发了几个实用的事件,通过响应这些事件可调整或包装响应。
以上是大佬教程为你收集整理的解读PHP的Yii框架中请求与响应的处理流程全部内容,希望文章能够帮你解决解读PHP的Yii框架中请求与响应的处理流程所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。