前言
第一部分: 半协程调度器
- 统一生成器接口
- 生成器迭代
- 生成器返回值
- 生成器委托
- 改写 return
- 抽象异步模型
- 引入异常处理
- 异常: 嵌套任务透传
- 异常: 传递流程
- 异常: 重新进行 CPS 变换
- 异常: 重新加入 Async
- Syscall 与 Context
- 调度器: 里程碑
- spawn
- callcc
- race 与 timeout
- all 与 parallel
- channel 与协程间通信
- 无缓存 channel
- 缓存 channel
- channel 演示
- FutureTask 与 fork
第二部分: Koa
- 穿越地心之旅
- 洋葱圈模型
- rightReduce与中间件compose
- Koa::Application
- Koa::Context
- Koa::Request
- Koa::Response
- Koa - HelloWorld
- Middleware Interface
- Middleware: 全局异常处理
- Middleware: Router
- Middleware: 请求超时
- 一个综合示例
附录
参考
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
Middleware: Router
Middleware: Router
路由是httpServer必不可少的组件,我们使用nikic的FastRoute来实现一个路由中间件:
<?php
use FastRoute\Dispatcher;
use FastRoute\RouteCollector;
use Minimalism\A\Server\Http\Context;
// 这里继承FastRoute的RouteCollector
class Router extends RouteCollector
{
public $dispatcher;
public function __construct()
{
$routeParser = new \FastRoute\RouteParser\Std();
$dataGenerator = new \FastRoute\DataGenerator\GroupCountBased();
parent::__construct($routeParser, $dataGenerator);
}
// 返回路由中间件
public function routes()
{
$this->dispatcher = new \FastRoute\Dispatcher\GroupCountBased($this->getData());
return [$this, "dispatch"];
}
// 路由中间件的主要逻辑
public function dispatch(Context $ctx, $next)
{
if ($this->dispatcher === null) {
$this->routes();
}
$uri = $ctx->url;
if (false !== $pos = strpos($uri, '?')) {
$uri = substr($uri, 0, $pos);
}
$uri = rawurldecode($uri);
// 从Context提取method与url进行分发
$routeInfo = $this->dispatcher->dispatch(strtoupper($ctx->method), $uri);
switch ($routeInfo[0]) {
case Dispatcher::NOT_FOUND:
// 状态码写入Context
$ctx->status = 404;
yield $next;
break;
case Dispatcher::METHOD_NOT_ALLOWED:
$ctx->status = 405;
break;
case Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];
// 从路由表提取处理器
yield $handler($ctx, $next, $vars);
break;
}
}
}
$router = new Router();
$router->get('/user/{id:\d+}', function(Context $ctx, $next, $vars) {
$ctx->body = "user={$vars['id']}";
});
// $route->post('/post-route', 'post_handler');
$router->addRoute(['GET', 'POST'], '/test', function(Context $ctx, $next, $vars) {
$ctx->body = "";
});
// 分组路由
$router->addGroup('/admin', function (RouteCollector $router) {
// handler :: (Context $ctx, $next, array $vars) -> void
$router->addRoute('GET', '/do-something', 'handler');
$router->addRoute('GET', '/do-another-thing', 'handler');
$router->addRoute('GET', '/do-something-else', 'handler');
});
$app->υse($router->routes());
我们已经拥有了一个支持多方法
正则
参数匹配
分组
功能的路由中间件。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论