- FuelPHP 教程
- FuelPHP - 首页
- FuelPHP - 简介
- FuelPHP - 安装
- FuelPHP - 架构概述
- FuelPHP - 简单Web应用
- FuelPHP - 配置
- FuelPHP - 控制器
- FuelPHP - 路由
- FuelPHP - 请求与响应
- FuelPHP - 视图
- FuelPHP - 展示器
- FuelPHP - 模型与数据库
- FuelPHP - 表单编程
- FuelPHP - 验证
- 高级表单编程
- FuelPHP - 文件上传
- FuelPHP - Ajax
- FuelPHP - HMVC 请求
- FuelPHP - 主题
- FuelPHP - 模块
- FuelPHP - 包
- Cookie & Session 管理
- FuelPHP - 事件
- FuelPHP - 邮件管理
- FuelPHP - 性能分析器
- 错误处理与调试
- FuelPHP - 单元测试
- 完整的运行示例
- FuelPHP 有用资源
- FuelPHP - 快速指南
- FuelPHP - 有用资源
- FuelPHP - 讨论
FuelPHP - 请求与响应
HTTP 请求和 HTTP 响应在任何 Web 应用中都扮演着重要的角色。我们需要获取 HTTP 请求的完整细节才能正确地处理它。处理完成后,我们需要通过 HTTP 响应将处理后的数据发送给客户端。
FuelPHP 提供了优秀的Request和Response类,分别用于读取和写入 HTTP 请求和 HTTP 响应。让我们在本节学习这两个类。
Request (请求)
在一个典型的 Web 应用中,应用需要解析当前请求的细节。Request 类提供简单的方法来解析当前请求,以便应用进行处理。Request 还提供了一个选项,可以通过充当 HTTP 客户端来创建新的请求。
创建新的请求使应用程序能够请求应用程序的其他部分或完全不同的应用程序并显示结果。让我们在本节学习如何解析传入的请求,并在 HMVC 请求章节学习如何创建新的请求。
解析请求
Request 类提供三种方法来获取 HTTP 请求的详细信息,如下所示:
active − 这是一个静态方法,它返回当前活动的 HTTP 请求。
$currentRequest = Request::active();
param − 它返回指定参数的值。它包含两个参数。第一个参数是参数名称,第二个参数是如果当前 HTTP 请求中不存在该参数时要返回的值。
$param = Request::active()->param('employee_name', 'none');
params − 它与 param 相同,只是它返回所有参数作为一个数组。
$params = Request::active()->params();
示例
让我们创建一个简单的表单,并使用 Request 类处理该表单。
步骤 1 − 在 employee 控制器中创建一个新的 action,action_request。
public function action_request() { }
步骤 2 − 调用 Request 方法获取当前请求的所有参数。
public function action_request() { $params = Request::active()->params(); }
步骤 3 − 转储获取到的参数数组。
public function action_request() { $params = Request::active()->params(); echo dump($params); }
步骤 4 − 修改路由,在路由配置文件 fuel/app/config/routes.php 中包含参数。
'employee/request(/:name)?' => array('employee/request', 'name' => 'name'),
现在,请求新的 action,https://127.0.0.1:8080/employee/request/Jon,它将显示以下响应。
Response (响应)
Response 类提供创建 HTTP 响应的选项。在大多数情况下,我们不需要直接使用 Response 类。相反,我们使用View(我们将在下一节学习)来创建 HTTP 响应。View 将 HTTP 响应隐藏在开发者面前,并使用底层的Response类将响应发送给客户端。在高级情况下,我们可以直接使用 Response 类并创建一个完整的 HTTP 响应。
创建响应
响应包含报头和正文。主要的报头是 HTTP 状态代码。HTTP 状态代码是在 HTTP 协议中定义的标准代码,用于描述响应。例如,状态代码 200 表示请求成功。
Response 类提供三个参数来创建 HTTP 响应:
- $body − HTTP 响应的正文
- $status_code − HTTP 响应的状态代码
- $headers − 可选的报头,作为数组
$body = "Hi, FuelPHP"; $headers = array ( 'Content-Type' => 'text/html', ); $response = new Response($body, 200, $headers);
让我们在 employee 控制器中创建一个新的 action,action_response,如下所示。
public function action_response() { $body = "Hi, FuelPHP"; $headers = array ( 'Content-Type' => 'text/html', ); $response = new Response($body, 200, $headers); return $response; }
结果
方法
Response 类提供许多方法来操作 HTTP 响应,如下所示:
forge − 它与上面看到的 Response 类构造函数相同。
return Response::forge("Hi, FuelPHP", 404);
redirect − 它提供了一个选项,用于重定向到 URL,而不是发送响应。它包含以下参数:
a. url − 目标 URL b. method - 重定向方法。location(默认)和refresh c. redirect_code - HTTP 状态代码。默认值为 302。
// use a URL Response::redirect('http://some-domain/index', 'refresh'); // or use a relative URI Response::redirect('employee/list');
redirect_back − 它类似于 redirect 方法,只是它重定向到上一页。如果找不到上一页,我们可以指定重定向页面。
// If there is no back page, go to the employee list page Response::redirect_back('/employee/list', 'refresh');
set_status − 它提供了一个选项来设置 HTTP 状态代码。
$response = new Response(); $response->set_status(404);
set_header − 它提供了一个选项来设置 HTTP 报头。
$response = new Response(); $response->set_header('Content-Type', 'application/pdf'); // replace previous value using third arguments $response->set_header('Content-Type', 'application/pdf', 'text/plain');
set_headers − 它与set_header相同,只是它提供了一个选项,可以使用数组设置多个报头。
$response = new Response(); $response->set_headers(array 'Content-Type' => 'application/pdf', 'Pragma' => 'no-cache', ));
get_header − 它可以获取之前设置的报头详细信息。
$response = new Response(); $response->set_header('Pragma', 'no-cache'); // returns 'no-cache' $header = $response->get_header('Pragma'); // returns array('Pragma' => 'no-cache') $header = $response->get_header();
body − 它提供了一个选项来设置 HTTP 响应的正文。
$response = new Response(); $response->body('Hi, FuelPHP'); // returns 'Hi, FuelPHP' $body = $response->body();
send_headers − 它将报头发送到请求的客户端。FuelPHP 使用此方法将响应发送给客户端。通常,我们不需要使用此方法。
$response->send_headers();
Send − 与 send_headers 相同,只是 HTTP 响应中的报头可能受到限制。
// send the headers as well $response->send(true); // only send the body $response->send(false); $response->send();