PHP路由库FastRoute的使用教程-php教程

资源魔 33 0

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 办法

GET以及HEAD办法必需失去一切通用效劳器的支持

为防止强迫用户为每一个资本手动注册 HEAD 路由,将应用一个婚配的 GET 路由呼应申请。PHP web SAPI 通明地从 HEAD 呼应中移除了实体主体,以是这类行为对绝年夜少数用户不影响。

然而,正在 Web SAPI 环境内部应用 FastRoute ,毫不能发送呼应 HEAD 申请而天生的实体主体,假如你长短 SAPI 用户,这是你的责任;正在这类状况下,FastRoute 无权限度你毁坏 HTTP 。

最初,请留意,使用顺序能够始终为给定资本指定其本人的 HEAD 办法路由以齐全绕过此行为。

保举教程:《PHP教程》

以上就是PHP路由库FastRoute的应用教程的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!