请求处理

Http 请求处理来源于 Http 组件,由其提供强大的 Http 解析预处理,支持 Swoole.

当用户发起一个 Http 请求的时候,Http 组件会将请求封装成一个 ServerRequestInterface 实现类,实现 PSR7 标准,并且将对象传递到控制器中。

由于 Http 解析是通过 parse_url 进行解析的,因此您需要配置好你的虚拟域名(virtual-host)进行访问,否则会提示 route 404 not found

由于 Http 组件实现 PSR7,所以用法是保持 PSR7 一致,操作可以根据 Http 进行查看

获取 $_GET

利用 getQueryParams() 方法获取所有 $_GET 参数。

  1. namespace Controller;
  2. use FastD\Http\ServerRequest;
  3. class IndexController
  4. {
  5. public function sayHello(ServerRequest $request)
  6. {
  7. $get = $request->getQueryParams();
  8. // some code
  9. }
  10. }

可以利用 getParam() 获取具体参数,例外方法内置判断参数是否存在,因此接受两个参数,第二个作为默认值,当不存在该值的时候,会默认返回第二个参数。如:

  1. $request->getParam("foo", "bar");

当没有 foo 索引的时候,就会默认返回 bar 的值。

获取 $_POST

利用 getParsedBody() 方法获取所有 $_POST 参数。

  1. namespace Controller;
  2. use FastD\Http\ServerRequest;
  3. class IndexController
  4. {
  5. public function sayHello(ServerRequest $request)
  6. {
  7. $post = $request->getParsedBody();
  8. // some code
  9. }
  10. }

可以利用 getParam() 获取具体参数,例外方法内置判断参数是否存在,因此接受两个参数,第二个作为默认值,当不存在该值的时候,会默认返回第二个参数。如:

  1. $request->getParam("foo", "bar");

当没有 foo 索引的时候,就会默认返回 bar 的值。

获取 PUT/DELETE

由于 PUT/DELETE 等请求方法相对特殊,数据需要在请求的源数据进行获取,并解析到 body 中。

  1. namespace Controller;
  2. use FastD\Http\ServerRequest;
  3. class IndexController
  4. {
  5. public function sayHello(ServerRequest $request)
  6. {
  7. $raw = (string) $request->getBody();
  8. $body = $request->getParsedBody();
  9. // some code
  10. }
  11. }
  1. namespace Controller;
  2. use FastD\Http\ServerRequest;
  3. class IndexController
  4. {
  5. public function sayHello(ServerRequest $request)
  6. {
  7. $cookies = $request->getCookieParams();
  8. $cookie = $request->getCookie('foo', 'bar');
  9. // some code
  10. }
  11. }

$_FILES 文件上传

利用 getUploadedFiles 方法可以很轻松获取上传的文件,方法返回一个 FastD\Http\UploadedFile 对象,对象继承 CURLFile 并实现自 PSR7 的 UploadedFileInterface

上传单个文件可以获取数组索引,进行操作,键名来自于 form 表单的 name 属性。

  1. namespace Controller;
  2. use FastD\Http\ServerRequest;
  3. class IndexController
  4. {
  5. public function sayHello(ServerRequest $request)
  6. {
  7. $files = $request->getUploadedFiles();
  8. $files['test']->moveTo('/path/to/upload');
  9. // some code
  10. }
  11. }

多个文件上传,可以利用 foreach 对数组进行迭代。

  1. namespace Controller;
  2. use FastD\Http\ServerRequest;
  3. class IndexController
  4. {
  5. public function sayHello(ServerRequest $request)
  6. {
  7. foreach ($request->getUploadedFiles() as $file) {
  8. $file->moveTo('/path/to/upload');
  9. }
  10. // some code
  11. }
  12. }

上传成功后返回一个文件的存储位置。moveTO 方法仅需要指定目录即可,文件系统会自动给其利用 md5_file 重新命名。

Raw 源数据

在部分特殊场景下,我们无法直接使用 $_POST 获取数据,只能通过 file_get_contents('php://input') 进行获取。可通过一下进行获取 raw 源数据。

  1. namespace Controller;
  2. use FastD\Http\ServerRequest;
  3. class IndexController
  4. {
  5. public function sayHello(ServerRequest $request)
  6. {
  7. $raw = (string) $request->getBody();
  8. }
  9. }

Session 支持

Session 目前使用最简洁的方式进行集成,通过服务提供器进行配置,仅需注册到 service 中即可开启 session 功能。

github: session-provider

下一节: 响应处理