austinhyde / patchboard
基于 nikic/fastroute 的简单路由器,提供高级接口和更多功能
Requires
- php: >=5.6.0
- nikic/fast-route: 0.6.*
- php-di/invoker: ~1.2
Requires (Dev)
- phpunit/phpunit: ~5.0
This package is not auto-updated.
Last update: 2024-09-18 17:24:17 UTC
README
基于 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();
用言语表达
- 从全局变量创建请求对象(来自 symfony/http-foundation 库)
- 创建 "authorized" 处理器。这只是一个在用户未授权时返回 403 的函数。
- 创建 "json" 处理器。这是一个将序列中下一个处理器的结果转换为 JSON 的函数。
- 创建一个新的 Router 对象
- 使用
/users
前缀创建一组路由。注意尾随的, $authorized, $json
,这指示组应用$authorized
和$json
处理器。 - 为
/users
创建 GET 和 POST 路由,并指示路由器调用相应的控制器方法。 - 根据 HTTP 方法和路径进行调用。特别处理路由未找到和方法不允许错误。
- 将响应发送回浏览器。
概念
Patchboard 的驱动原理是尽可能简单,同时足够灵活,可以用于任何应用程序。Patchboard 通过 仅 作为路由分发器来实现这一点。就是这样。在核心上,它是一个美化的 call_user_func
实现,该模式匹配函数名。它所做的唯一假设是您正在基于 HTTP 方法和请求路径进行路由。
Patchboard 的核心单元是 路由。每个路由都与 HTTP 方法和路径匹配,并可以附加任意数量的 处理器。
处理器简单地说要么是一个可调用的,要么是实现 Patchboard\HandlerInterface
接口的实现。可调用的(或 handle
方法)将路由 上下文 作为参数。然后处理器可以执行诸如验证用户、处理 HTTP 请求、转换输出等操作。
路由上下文是一个包含有关匹配路由和分配的处理器信息的对象。处理器可以使用 hasNextHandler()
和 handleNext()
方法来检查是否有另一个处理器要调用,并分别调用下一个处理器。handleNext()
返回序列中下一个处理器的结果。这允许您“包装”内部处理器并操纵其结果。
对于分配给路由的任何处理器列表,处理器将按顺序执行,直到返回非空结果或没有更多处理器。自己调用下一个处理器的处理器将内部游标推进到下一个,这样就不会调用任何处理器两次。