avris/http

HTTP 请求/响应抽象

v4.0.0 2018-01-12 19:36 UTC

This package is not auto-updated.

Last update: 2024-09-12 22:42:25 UTC


README

HTTP 请求/响应抽象

安装

composer require avris/http

用法

请求

PHP 在丑陋的全局变量中放置的内容 $_SERVER$_GET$_POST$_COOKIE$_FILES,通过 Request 类封装在良好的对象中。只需这样做

$request = Request::fromGlobals();

就可以优雅地访问所有数据并将其传递出去。

  • getMethod(): string
  • isPost(): bool
  • getScheme(): string
  • getHost(): string
  • getAbsoluteBase(): string
  • getBase(): string
  • getFrontController(): string
  • getUrl(): string
  • getCleanUrl(): string
  • getFullUrl(): string
  • getIp(bool $safe = true): string
  • isAjax(): bool
  • getQuery(): Bag -- $_GET
  • getData(): Bag -- $_POST
  • getCookies(): Bag
  • getServer(): Bag
  • getFiles(): FileBag
  • getHeaders(): HeaderBag
  • getBody(): string
  • getJsonBody()

为了测试等目的,您还可以创建一个带有一些任意数据的请求对象,例如

$request = Request::create('DELETE', '/posts/123', [], ['redirect' => '1']);

头部抽象层提供了额外的功能,例如获取最佳的 Accept-* 值。

请求中的文件将被封装在 UploadedFile

if ($request->isPost()) {
    $file = $request->getFiles()->get('attachment');
    $filename = $file->moveToRandom(__DIR__ . '/pics');
    $post->setAttachment($filename);
}

响应

类似地,Response 类封装了 HTTP 响应。例如,您的控制器可以返回

return new Response(
    '<strong>OK</strong>',
    201,
    ['Content-Type' => 'text/html; charset=utf-8'],
    new CookieBag([
        new Cookie('foo', 'bar', new \DateTime('+10 minutes')),
    ]),
);

这个对象可以被传递、修改、扩展等,而实际上不需要通过 HTTP 发送任何数据。只有执行了 $response->send() 之后,您的头部、cookie、响应代码和内容才会被发送。

该库提供了一些创建更标准响应的辅助函数

* `new JsonResponse(['foo' => bar])`
* `new RedirectResponse('/done')`
* `new FileResponse($post->getAttachmentPath(), 'image.png')`
* `new MemoryFileResponse($image->getContent())`
* `new StreamedResponse(function() { while (true) { echo 'heartbeat' . PHP_EOL; sleep(1); }})`

会话

您可以使用 Session 对象封装而不是使用 $_SESSION 超全局变量。它基本上工作相同,但允许您编写更优雅的、面向对象的、可测试的代码,并轻松交换标准会话与不同的会话。

StoragelessSession 是标准 HTTP 会话的替代方法。它不在服务器上存储任何信息,而是使用 cookie 传输信息。(因此,它仅应在安全连接中用于少量非机密数据!)

$session = new StoragelessSession;
// ...
$session->onRequest($request); 
// ...
$foo = $session->get('foo'); 
$session->set('bar', $bar);
// ...
$session->onResponse($response);
// ...
$response->send();

版权