使用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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!