搭建个人PHP框架--引入nikic/fast-route实现路由功能

21 篇文章 0 订阅

目录

引入nikic/fast-route包

编写路由配置加载方法

涉及到的exception类写法

创建编写功能路由文件,(演示:route/web.php、route/api.php)

文件的编写格式(可以对Route文件的make_dispatcher方法实现自定义) 

入口文件处引入composer自动加载文件,并调用路由加载方法

测试

测试控制器

路由访问


GitHUb地址:https://github.com/nikic/FastRoute/tree/v1.3.0

引入nikic/fast-route包

# 本次引入的是1.3.0版本的composer包
composer require nikic/fast-route v1.3.0

编写路由配置加载方法

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/6/14
 * Time: 0:35
 */
namespace App\Lib;
use App\Exception\MethodNotAllowedException;
use App\Exception\RouteNotFoundException;
use FastRoute\Dispatcher;
use FastRoute\RouteCollector;
use function FastRoute\simpleDispatcher;

class Route
{
    public static function load()
    {
        // 获取已配置的路由列表
        $routeFiles = glob(ROUTE_PATH.DIRECTORY_SEPARATOR.'*.php');
        foreach ($routeFiles as $file) {
            $routeFileList[] = require_once($file);
        }
        // 加载所有路由文件配置的路由
        $dispatcher = self::make_dispatcher($routeFileList);

        // Fetch method and URI from somewhere
        $httpMethod = $_SERVER['REQUEST_METHOD'];
        $uri = $_SERVER['REQUEST_URI'];

        // Strip query string (?foo=bar) and decode URI
        if (false !== $pos = strpos($uri, '?')) {
            $uri = substr($uri, 0, $pos);
        }
        $uri = rawurldecode($uri);
        // 路由调度
        $routeInfo = $dispatcher->dispatch($httpMethod, $uri);
        switch ($routeInfo[0]) {
            case Dispatcher::NOT_FOUND: // 找不到请求方法
                // ... 404 Not Found
                throw new RouteNotFoundException("请求方法不存在:{$uri}");
                break;
            case Dispatcher::METHOD_NOT_ALLOWED: // 请求类型错误
                $allowedMethods = $routeInfo[1];
                // ... 405 Method Not Allowed
                throw new MethodNotAllowedException("请求类型错误({$httpMethod}),当前方法允许请求类型({$allowedMethods[0]})");
                break;
            case Dispatcher::FOUND: // 找到请求方法:调用方法即可
                $handler = $routeInfo[1];
                $vars = $routeInfo[2];

                call_user_func([new $handler[0],$handler[1]],$vars);
                break;
        }
    }

    private static function make_dispatcher($routeFileList)
    {
        return simpleDispatcher(function(RouteCollector $router) use($routeFileList) {
            foreach ($routeFileList as $routeFile) {
                if (isset($routeFile['prefix'])) {
                    $routers = $routeFile[0];
                    $router->addGroup($routeFile['prefix'],function(RouteCollector $router) use($routers) {
                        if ($routers) {
                            foreach ($routers as $routeItem) {
                                $router->addRoute(strtoupper($routeItem[0]),$routeItem[1],$routeItem[2]);
                            } unset($routeItem);
                        }
                    });
                } else {
                    if ($routeFile) {
                        foreach ($routeFile as $routeItem) {
                            $router->addRoute(strtoupper($routeItem[0]),$routeItem[1],$routeItem[2]);
                        } unset($routeItem);
                    }
                }
            } unset($routeFile);
        });
    }
}

涉及到的exception类写法

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/6/14
 * Time: 0:05
 */
namespace App\Exception;
use Throwable;

class MethodNotAllowedException extends \Exception
{
    public function __construct($message = "", $code = 0, Throwable $previous = null)
    {
        parent::__construct($message, $code, $previous);
    }
}

创建编写功能路由文件,(演示:route/web.php、route/api.php)

文件的编写格式(可以对Route文件的make_dispatcher方法实现自定义) 

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/6/13
 * Time: 15:58
 */
// 不分组格式
return [
    ['GET','/api/hello',[\App\Controller\TestController::class,'index']],
];
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/6/13
 * Time: 15:58
 */
// 分组格式
return [
    'prefix' => '/',
    [
        ['get','users',[\App\Controller\TestController::class,'index']],
    ]
];

入口文件处引入composer自动加载文件,并调用路由加载方法

<?php
// 定义目录常量
define('ROOT_DOCUMENT_PATH',dirname(__DIR__) . DIRECTORY_SEPARATOR);

// 自动加载文件
require_once(ROOT_DOCUMENT_PATH.'vendor/autoload.php');

// 设置异常集中处理类
set_exception_handler([\App\ExceptionHandle::class,'handle']);

// 加载路由配置文件
\App\Lib\Route::load();

测试

测试控制器

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/6/13
 * Time: 16:04
 */
namespace App\Controller;

class TestController extends Controller
{
    public function index()
    {
        echo 1111;
    }
}

路由访问

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东小记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值