亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中如何使用FastRoute路由庫

發布時間:2020-05-20 15:34:13 來源:億速云 閱讀:268 作者:鴿子 欄目:編程語言

這個庫提供了基于正則表達式的快速路由實現。這篇文章解釋了 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路由庫FastRoute的使用教程的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丘北县| 斗六市| 武乡县| 阳西县| 尼木县| 临澧县| 威海市| 克什克腾旗| 石林| 甘孜县| 桐城市| 阿拉善右旗| 余干县| 曲周县| 红安县| 通渭县| 宿松县| 博白县| 蒙自县| 孟连| 玉环县| 临湘市| 恩施市| 资源县| 昭觉县| 甘谷县| 双柏县| 龙陵县| 崇州市| 嘉黎县| 宁乡县| 玉山县| 万荣县| 拜城县| 吴旗县| 县级市| 莱州市| 富阳市| 庆阳市| 图们市| 襄城县|