austinhyde/patchboard

基于 nikic/fastroute 的简单路由器,提供高级接口和更多功能

dev-master 2016-02-03 15:34 UTC

This package is not auto-updated.

Last update: 2024-09-18 17:24:17 UTC


README

Build Status

基于 nikic/fastroute 构建,并受到 Macaron 网络框架路由部分的影响,这是一个简单、可扩展、无偏见且快速的 PHP 网络应用程序和服务路由库。

重要: 这仍然是 alpha 版本,但我希望让它成为现实。如果您尝试使用并发现任何问题,请创建一个问题!

安装

composer require austinhyde/patchboard

示例

他们说示例胜过千言万语。或者那可能是其他什么。

<?php

$req = Request::createFromGlobals();
$authorized = function() use ($req) {
  list($user, $pass) = explode(':', base64_decode(
    explode(' ', $req->headers->get('Authorization'))[1]
  ));
  if ($user != 'admin' && $pass != 'admin') {
    return new JSONResponse(['message'=>'Not Authorized'], 403);
  }
};

$json = function($c) use ($req) {
  $r = $c->nextHandler();
  if ($r !== null && !($r instanceof Response)) {
    return new JSONResponse($r, 200);
  }
};

$r = new Patchboard\Router;
$r->group('/users', function($r) {
  $r->get('/', function() {
    return [['user_id' => 1, 'username' => 'foo']];
  });
  $r->get('/{id}', function(Context $ctx) {
    return ['user_id' => $ctx->getPathParam('id'), 'username' => 'foo'];
  });
}, $authorized, $json);

try {
  $response = $r->dispatch($req->getMethod(), $req->getPathInfo());
}
catch (Patchboard\RouteNotFoundException $ex) {
  $response = new JSONResponse(['message' => $ex->getMessage()], 404);
}
catch (Patchboard\MethodNotAllowedException $ex) {
  $response = new JSONResponse(['message' => $ex->getMessage()], 405,
    ['Allow' => $ex->getAllowed()]);
}

$response->send();

用言语表达

  1. 从全局变量创建请求对象(来自 symfony/http-foundation 库)
  2. 创建 "authorized" 处理器。这只是一个在用户未授权时返回 403 的函数。
  3. 创建 "json" 处理器。这是一个将序列中下一个处理器的结果转换为 JSON 的函数。
  4. 创建一个新的 Router 对象
  5. 使用 /users 前缀创建一组路由。注意尾随的 , $authorized, $json,这指示组应用 $authorized$json 处理器。
  6. /users 创建 GET 和 POST 路由,并指示路由器调用相应的控制器方法。
  7. 根据 HTTP 方法和路径进行调用。特别处理路由未找到和方法不允许错误。
  8. 将响应发送回浏览器。

概念

Patchboard 的驱动原理是尽可能简单,同时足够灵活,可以用于任何应用程序。Patchboard 通过 作为路由分发器来实现这一点。就是这样。在核心上,它是一个美化的 call_user_func 实现,该模式匹配函数名。它所做的唯一假设是您正在基于 HTTP 方法和请求路径进行路由。

Patchboard 的核心单元是 路由。每个路由都与 HTTP 方法和路径匹配,并可以附加任意数量的 处理器

处理器简单地说要么是一个可调用的,要么是实现 Patchboard\HandlerInterface 接口的实现。可调用的(或 handle 方法)将路由 上下文 作为参数。然后处理器可以执行诸如验证用户、处理 HTTP 请求、转换输出等操作。

路由上下文是一个包含有关匹配路由和分配的处理器信息的对象。处理器可以使用 hasNextHandler()handleNext() 方法来检查是否有另一个处理器要调用,并分别调用下一个处理器。handleNext() 返回序列中下一个处理器的结果。这允许您“包装”内部处理器并操纵其结果。

对于分配给路由的任何处理器列表,处理器将按顺序执行,直到返回非空结果或没有更多处理器。自己调用下一个处理器的处理器将内部游标推进到下一个,这样就不会调用任何处理器两次。