百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> PHP路由库FastRoute的运用教程
分享文章到:

PHP路由库FastRoute的运用教程

发布时间:09/01 来源:未知 浏览: 关键词:

GitHub: https://github.com/nikic/FastRoute

这个库供给了基于正则表达式的快速路由实现。这篇文章说明了 FastRoute 是怎样工作的和它为什么很快。

安置

通过 composer 安置

composer require nikic/fast-route

要求 PHP 5.4 及更高的版本

使用

这是一个根本的使用示例

<?php
require '/path/to/vendor/autoload.php';
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    $r->addRoute('GET', '/users', 'get_all_users_handler');
    // {id} 必需是一个数字 (\d+)
    $r->addRoute('GET', '/user/{id:\d+}', 'get_user_handler');
    //  /{title} 后缀是可选的
    $r->addRoute('GET', '/articles/{id:\d+}[/{title}]', 'get_article_handler');
});
// 猎取恳求的办法和 URI
$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];
// 去除查询字符串( ? 后面的内容) 和 解码 URI
if (false !== $pos = strpos($uri, '?')) {
    $uri = substr($uri, 0, $pos);
}
$uri = rawurldecode($uri);
$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
switch ($routeInfo[0]) {
    case FastRoute\Dispatcher::NOT_FOUND:
        // ... 404 Not Found 没寻到对应的办法
        break;
    case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
        $allowedMethods = $routeInfo[1];
        // ... 405 Method Not Allowed  办法不同意
        break;
    case FastRoute\Dispatcher::FOUND: // 寻到对应的办法
        $handler = $routeInfo[1]; // 获得处置函数
        $vars = $routeInfo[2]; // 猎取恳求参数
        // ... call $handler with $vars // 调取处置函数
        break;
}

定义路由

通过调取 FastRoute\simpleDispatcher() 函数来定义路由,该函数接受一个以 FastRoute\RouteCollector 实例为参数的闭包作为参数。通过在 collector 实例里面调取 addRoute() 增添路由。

$r->addRoute($method, $routePattern, $handler);

$method 是大写的 HTTP 办法,能够被某个路由匹配,可以使用数组指定多个有效的 $method

// 这里两行调取
$r->addRoute('GET', '/test', 'handler');
$r->addRoute('POST', '/test', 'handler');
// 等同于这一行调取
$r->addRoute(['GET', 'POST'], '/test', 'handler');

默许状况下 $routePattern 使用一种语法,比方 {foo} 是指定名称为 foo 的占位符,可以匹配正则表达式 [^/]+. 。要调整占位符匹配的模式,可以通过编写 {bar:[0-9] +} 来指定自定义模式。一些例子

// 匹配 /user/42,不匹配 /user/xyx
$r->addRoute('GET', '/user/{id:\d+}', 'handler');
// 匹配 /user/foobar,不匹配 /user/foo/bar
$r->addRoute('GET', '/user/{name}', 'handler');
// 匹配 /user/foobar,也匹配 /user/foo/bar
$r->addRoute('GET', '/user/{name:.+}', 'handler');

路由占位符的自定义模式不克不及使用捕捉组,例如 {lang:(en|de)} 不是有效的占位符,由于 () 是一个捕捉组,可以使用 {lang:en|de} 或者 {lang:(?:en|de)} 代替。

别的,在路由 [...] 中定义的部分是可选匹配的,所以 /foo[bar] 将匹配 /foo 和 /foobar 。路由可选部分只支撑在定义的末尾,而不克不及在定义的中心。

// 这个路由有,[/{name}] 可选中匹配部分
$r->addRoute('GET', '/user/{id:\d+}[/{name}]', 'handler');
// 等同于这两个路由
$r->addRoute('GET', '/user/{id:\d+}', 'handler');
$r->addRoute('GET', '/user/{id:\d+}/{name}', 'handler');
// 多层嵌套可选路由,也是支撑的
$r->addRoute('GET', '/user[/{id:\d+}[/{name}]]', 'handler');
// 这个路由定义无效,由于可选部分只能在定义的末尾
$r->addRoute('GET', '/user[/{id:\d+}]/{name}', 'handler');

$handler 参数不必然必需是回调函数,它也可以是操纵器类名或任何其他类型的数据。FastRoute 只告诉你哪个 handler 对应 URI,怎样说明它取决于你。

恳求办法的书写快速方式

关于 GETPOSTPUTPATCHDELETE HEAD 恳求办法,可使用快速方式。

$r->get('/get-route', 'get_handler');
$r->post('/post-route', 'post_handler');
// 等同于
$r->addRoute('GET', '/get-route', 'get_handler');
$r->addRoute('POST', '/post-route', 'post_handler');

路由组

你可以在一个组内定义路由,统一组内的路由有雷同的前缀。

$r->addGroup('/admin', function (RouteCollector $r) {
    $r->addRoute('GET', '/do-something', 'handler');
    $r->addRoute('GET', '/do-another-thing', 'handler');
    $r->addRoute('GET', '/do-something-else', 'handler');
});
// 等同于
$r->addRoute('GET', '/admin/do-something', 'handler');
$r->addRoute('GET', '/admin/do-another-thing', 'handler');
$r->addRoute('GET', '/admin/do-something-else', 'handler');

可以定义多层嵌套组构造。

缓存

使用 simpleDispatcher 定义路由的回调函数可以无缝缓存。通过使用 cachedDispatcher 而不是 simpleDispatcher,可以缓存生成的路由数据并从缓存的信息构建调度。

<?php
$dispatcher = FastRoute\cachedDispatcher(function(FastRoute\RouteCollector $r) {
    $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
    $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1');
    $r->addRoute('GET', '/user/{name}', 'handler2');
}, [
    'cacheFile' => __DIR__ . '/route.cache', /* required 缓存文件途径,必需设定 */
    'cacheDisabled' => IS_DEBUG_ENABLED,     /* optional, enabled by default 可否缓存,可选参数,默许状况下开启 */
]);

该函数的第二个参数是一个选项数组,可用于指定缓存文件途径等等。

调度 URI

通过调取 dispatch() 调度 URI。这个办法接受 HTTP 办法 和一个 URI 作为参数。获得这两个信息是你本人的工作,这个库并不绑定到 PHP web SAPIs 。

dispatch() 返回一个数组,第一个元素是一个状态码,状态码是 Dispatcher::NOT_FOUNDDispatcher::METHOD_NOT_ALLOWEDDispatcher::FOUND 其中之一。关于 Dispatcher::METHOD_NOT_ALLOWED 状态,第二个数组元素包括同意供给的 URI 的 HTTP 办法列表。

[FastRoute\Dispatcher::METHOD_NOT_ALLOWED, ['GET', 'POST']]

关于 Dispatcher::FOUND 状态,第二个数组元素是 $handler ,第三个数组元素是是一个包括所有占位符的数组

/* Routing against GET /user/nikic/42 */
[FastRoute\Dispatcher::FOUND, 'handler0', ['name' => 'nikic', 'id' => '42']]

重写路由解析器和调度器

这个库使用三个组件,一个路由解析器,一个数据生成器,一个调度器。这个三个组件实现以下接口

<?php
namespace FastRoute;
interface RouteParser {
    public function parse($route);
}
interface DataGenerator {
    public function addRoute($httpMethod, $routeData, $handler);
    public function getData();
}
interface Dispatcher {
    const NOT_FOUND = 0, FOUND = 1, METHOD_NOT_ALLOWED = 2;
    public function dispatch($httpMethod, $uri);
}

路由解析器猎取路由模式字符串并将其转换为路由信息数组,其中每个道路信息又是它的部分数组。

/* The route /user/{id:\d+}[/{name}] converts to the following array: */
[
    [
        '/user/',
        ['id', '\d+'],
    ],
    [
        '/user/',
        ['id', '\d+'],
        '/',
        ['name', '[^/]+'],
    ],
]

然后可以将该数组传递给数据生成器的 addRoute() 办法,在增加了所有路由之后,调取生成器的 getData(),它将返回调度器所需的所有路由数据。

调度程序通过结构函数接受路由数据,并供给 dispatch()办法。

路由解析器可以被独自覆盖,然而数据生成器和调度器应当总是一起修改,由于前者的输出与后者的输入严密耦合。

当使用 simpleDispatcher / cachedDispatcher 时,可以通过传入额外的参数,停止覆盖

<?php
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    /* ... */
}, [
    'routeParser' => 'FastRoute\\RouteParser\\Std',
    'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased',
    'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased',
]);

上面给出了默许的设定,通过把 GroupCountBased 更换成 GroupPosBased 可以使用完全不一样的调度战略

关于HEAD恳求的说明

HTTP 标准要求效劳器 同时支撑 GET HEAD 办法

GETHEAD办法必需得到所有通用效劳器的支撑

为幸免强迫会员为每个资源手动注册 HEAD 路由,将使用一个匹配的 GET 路由响应恳求。PHP web SAPI 透亮地从 HEAD 响应中移除实体主体,所以这种行动对绝大多数会员没有影响。

但是,在 Web SAPI 环境外部使用 FastRoute ,绝不克不及发送响应 HEAD 恳求而生成的实体主体,假如你是非 SAPI 会员,这是你的责任;在这种状况下,FastRoute 无权限制你毁坏 HTTP 。

最后,请留意,利用程序可以始终为给定资源指定其本人的 HEAD 办法路由以完全绕过此行动。

引荐教程:《PHP教程》

以上就是PHP路由库FastRoute的使用教程的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有151人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板