woss/http

0.1.0 2019-02-08 12:43 UTC

This package is auto-updated.

Last update: 2024-09-09 14:15:31 UTC


README

不,它不是一个PHP框架。

Woss\Http 包是一个类库,旨在简化PHP语言中HTTP协议的处理工作,通过透明和明确地展示应用程序中发生的情况,并允许进行更简单的单元测试。

该包内部包含三个 命名空间,分别是

  • Woss\Http\Message,包含处理HTTP消息的类;
  • Woss\Http\Server,包含简化应用程序开发的类;
  • Woss\Http\Client,包含外部请求的类;

安装

最简单的方法是通过Composer进行安装

$ composer install woss/http

应用程序

使用 Woss\Http 构建的应用程序将遵循 中间件 的概念,其中每个应用程序组件之间的责任区分和分离非常清晰。HTTP请求将通过 pipe 架构传播,直到生成HTTP响应。

pipe 架构支持三个基本实体

  1. 匿名函数 function (Request $request, $next): Response)
  2. 实现 handle(Request $request): Response 方法的 handler 类;
  3. 实现 process(Request $request, $next): Response 方法的 middleware 类;

匿名函数

基于匿名函数的实体有两个参数:$request,表示输入的HTTP请求,和$next,表示 pipe 中的下一个实体。返回值必须是 Response 实例。

use Woss\Http\Message\{Request, Response};

function (Request $request, $next): Response
{
    log('debug', (string) $request);
    
    $response = $next($request);
    
    log('debug', (string) $response);
    
    return $response;
}

处理器类

处理器类通过实现 handle 方法而具有特征,该方法仅接受一个参数 $request,表示输入的HTTP请求,并生成一个 Response 实例。与匿名函数和中 middleware 不同,处理器类没有能力在 pipe 中传播请求,因此它必须生成一个HTTP响应。因此,处理器类通常出现在 pipe 的末尾。

use Woss\Http\Message\{Request, Response, Stream};

class ListAllUsers
{
    public function __construct($users)
    {
        $this->users = $users;
    }
    
    public function handle(Request $request): Response
    {
        $users = $this->users->getAll();
        $content = json_encode($users);
        
        $body = new Stream('php://memory', 'w');
        
        $body->write($content);
        
        $response = new Response($body, 200, [
            'Content-Type' => 'application/json',
            'Content-Length' => strlen($content),
        ]);
        
        return $response;
    }
}

中间件类

中间件类通过实现 process 方法而具有特征,该方法接受两个参数,$request,表示输入的HTTP请求,和$next,表示架构中的下一个实体,返回值始终是 Response 实例。由于具有 $next 参数,中间件类,就像匿名函数一样,有权在 pipe 中传播请求,因此它没有生成HTTP响应的义务。因此,中间件类通常用于修改输入的HTTP请求和/或由其他实体产生的HTTP响应。

use Woss\Http\Message\{Request, Response};

class Cache
{
    public function __construct($cache)
    {
        $this->cache = $cache;
    }
    
    public function process(Request $request, $next): Response
    {
        // Se houver cache da resposta, retorne-a
        if ($this->cache->exists($request)) {
            return $this->cache->get($request);
        }
        
        // Caso contrário, gere a resposta HTTP e a armazene no cache
        $response = $next($request);
        
        $this->cache->create($request, $response);
        
        return $response;
    }
}

pipe 架构

pipe 架构是通过 Woss\Http\Server\Pipeline 类实现的,该类实现了 handle(Request $request): Response 方法。所有 pipe 中的实体都由传递给类构造函数的可迭代对象定义。

use Woss\Http\Message\{ServerRequest, Request, Response};
use Woss\Http\Server\Pipeline;

$pipe = new Pipeline([
    function (Request $request, $next): Response
    {
        log('debug', (string) $request);
        
        $response = $next($request);
        
        log('debug', (string) $response);
        
        return $response;
    },
    new Cache($services->get('cache')),
    new ListAllUsers($services->get('users'))
]);

$request = ServerRequest::fromGlobals();
$response = $pipe->handle($request);

echo (string) $response;