使用Composer从零开发一个简单的restful框架(04)-路由
路由
新建core/RouteItem.php
,内容如下
<?php
namespace core;
class RouteItem {
public function __construct(public string $method, public string $uri, public \Closure | string $cb) { }
}
新建core/Router.php
,内容如下
<?php
namespace core;
class Router {
private array $routes = [];
public function __construct() {
// 加载路由文件(路由文件使用 $router 访问)
$router = $this;
foreach (glob(PATH_ROUTE . '*.php') as $routeFile) {
require_once $routeFile;
}
}
// 开始路由处理
public function routing(Request $request, Response $response): void {
$uri = $request->getUri();
slash_add_end($uri);
$this->dispatch($request->getMethod(), $uri, $request, $response);
$response->send();
}
public function get(string $uri, \Closure | string $cb): void {
$this->addRoute('get', $uri, $cb);
}
public function post(string $uri, \Closure | string $cb): void {
$this->addRoute('post', $uri, $cb);
}
public function put(string $uri, \Closure | string $cb): void {
$this->addRoute('put', $uri, $cb);
}
public function delete(string $uri, \Closure | string $cb): void {
$this->addRoute('delete', $uri, $cb);
}
public function patch(string $uri, \Closure | string $cb): void {
$this->addRoute('patch', $uri, $cb);
}
public function options(string $uri, \Closure | string $cb): void {
$this->addRoute('options', $uri, $cb);
}
public function any(string $uri, \Closure | string $cb): void {
$methods = ['get', 'post', 'put', 'delete', 'patch', 'options'];
foreach ($methods as $method) {
$this->addRoute($method, $uri, $cb);
}
}
private function addRoute(string $method, string $uri, \Closure | string $cb): void {
$method = strtoupper($method);
slash_add($uri);
$routeItem = new RouteItem($method, $uri, $cb);
$this->routes[] = $routeItem;
}
private function dispatch(string $method, string $uri, Request $request, Response $response): void {
/** @var RouteItem $item */
foreach ($this->routes as $item) {
if ($method != $item->method || $uri != $item->uri) continue;
($item->cb)($request, $response);
return;
}
}
}
编辑core/App.php
,修改构造函数
public function __construct() {
$this->setEnv();
$router = new Router();
$request = new Request();
$response = new Response();
$router->routing($request, $response);
}
配置
新建route
目录,用于存放应用路由文件
$ pwd
/d/apps/wamp/www/phpapi
$ mkdir route
$ ll
total 13
drwxr-xr-x 1 Administrator 197121 0 May 3 15:23 app/
-rw-r--r-- 1 Administrator 197121 150 May 3 15:36 composer.json
-rw-r--r-- 1 Administrator 197121 5256 May 3 15:36 composer.lock
drwxr-xr-x 1 Administrator 197121 0 May 3 15:48 core/
drwxr-xr-x 1 Administrator 197121 0 May 3 15:53 public/
drwxr-xr-x 1 Administrator 197121 0 May 3 16:10 route/
drwxr-xr-x 1 Administrator 197121 0 May 3 15:53 runtime/
drwxr-xr-x 1 Administrator 197121 0 May 3 15:36 vendor/
新建route/test.php
,内容如下
<?php
use core\Request;
use core\Response;
use core\Router;
/** @var Router $router */
$router->get('/', function(Request $request, Response $response) {
$response->text("from /");
});
$router->get('/test', function(Request $request, Response $response) {
$response->text("from /test");
});
$router->get('/test2', function(Request $request, Response $response) {
$response->text("from /test2");
});
测试
浏览器分别访问 http://phpapi.com/、http://phpapi.com/test、http://phpapi.com/test2、http://phpapi.com/xxx,应该分别是对应的路由输出和一个 404 Not Found
本作品采用《CC 协议》,转载必须注明作者和本文链接