ホームページ バックエンド開発 PHPチュートリアル PHP ルーティング ライブラリ FastRoute の使用に関するチュートリアル

PHP ルーティング ライブラリ FastRoute の使用に関するチュートリアル

Apr 30, 2020 am 10:00 AM
php

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

这个库提供了基于正则表达式的快速路由实现。这篇文章解释了 FastRoute 是如何工作的和它为什么很快。

安装

通过 composer 安装

composer require nikic/fast-route

要求 PHP 5.4 及更高的版本

使用

这是一个基本的使用示例

<?php
require &#39;/path/to/vendor/autoload.php&#39;;
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    $r->addRoute(&#39;GET&#39;, &#39;/users&#39;, &#39;get_all_users_handler&#39;);
    // {id} 必须是一个数字 (\d+)
    $r->addRoute(&#39;GET&#39;, &#39;/user/{id:\d+}&#39;, &#39;get_user_handler&#39;);
    //  /{title} 后缀是可选的
    $r->addRoute(&#39;GET&#39;, &#39;/articles/{id:\d+}[/{title}]&#39;, &#39;get_article_handler&#39;);
});
// 获取请求的方法和 URI
$httpMethod = $_SERVER[&#39;REQUEST_METHOD&#39;];
$uri = $_SERVER[&#39;REQUEST_URI&#39;];
// 去除查询字符串( ? 后面的内容) 和 解码 URI
if (false !== $pos = strpos($uri, &#39;?&#39;)) {
    $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(&#39;GET&#39;, &#39;/test&#39;, &#39;handler&#39;);
$r->addRoute(&#39;POST&#39;, &#39;/test&#39;, &#39;handler&#39;);
// 等同于这一行调用
$r->addRoute([&#39;GET&#39;, &#39;POST&#39;], &#39;/test&#39;, &#39;handler&#39;);
ログイン後にコピー

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

// 匹配 /user/42,不匹配 /user/xyx
$r->addRoute(&#39;GET&#39;, &#39;/user/{id:\d+}&#39;, &#39;handler&#39;);
// 匹配 /user/foobar,不匹配 /user/foo/bar
$r->addRoute(&#39;GET&#39;, &#39;/user/{name}&#39;, &#39;handler&#39;);
// 匹配 /user/foobar,也匹配 /user/foo/bar
$r->addRoute(&#39;GET&#39;, &#39;/user/{name:.+}&#39;, &#39;handler&#39;);
ログイン後にコピー

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

另外,在路由 [...] 中定义的部分是可选匹配的,所以 /foo[bar] 将匹配 /foo 和 /foobar 。路由可选部分只支持在定义的末尾,而不能在定义的中间。

// 这个路由有,[/{name}] 可选择匹配部分
$r->addRoute(&#39;GET&#39;, &#39;/user/{id:\d+}[/{name}]&#39;, &#39;handler&#39;);
// 等同于这两个路由
$r->addRoute(&#39;GET&#39;, &#39;/user/{id:\d+}&#39;, &#39;handler&#39;);
$r->addRoute(&#39;GET&#39;, &#39;/user/{id:\d+}/{name}&#39;, &#39;handler&#39;);
// 多层嵌套可选路由,也是支持的
$r->addRoute(&#39;GET&#39;, &#39;/user[/{id:\d+}[/{name}]]&#39;, &#39;handler&#39;);
// 这个路由定义无效,因为可选部分只能在定义的末尾
$r->addRoute(&#39;GET&#39;, &#39;/user[/{id:\d+}]/{name}&#39;, &#39;handler&#39;);
ログイン後にコピー

$handler 参数不一定必须是回调函数,它也可以是控制器类名或任何其他类型的数据。FastRoute 只告诉你哪个 handler 对应 URI,如何解释它取决于你。

请求方法的书写快捷方式

对于 GETPOSTPUTPATCHDELETE HEAD 请求方法,可使用快捷方式。

$r->get(&#39;/get-route&#39;, &#39;get_handler&#39;);
$r->post(&#39;/post-route&#39;, &#39;post_handler&#39;);
// 等同于
$r->addRoute(&#39;GET&#39;, &#39;/get-route&#39;, &#39;get_handler&#39;);
$r->addRoute(&#39;POST&#39;, &#39;/post-route&#39;, &#39;post_handler&#39;);
ログイン後にコピー

路由组

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

$r->addGroup(&#39;/admin&#39;, function (RouteCollector $r) {
    $r->addRoute(&#39;GET&#39;, &#39;/do-something&#39;, &#39;handler&#39;);
    $r->addRoute(&#39;GET&#39;, &#39;/do-another-thing&#39;, &#39;handler&#39;);
    $r->addRoute(&#39;GET&#39;, &#39;/do-something-else&#39;, &#39;handler&#39;);
});
// 等同于
$r->addRoute(&#39;GET&#39;, &#39;/admin/do-something&#39;, &#39;handler&#39;);
$r->addRoute(&#39;GET&#39;, &#39;/admin/do-another-thing&#39;, &#39;handler&#39;);
$r->addRoute(&#39;GET&#39;, &#39;/admin/do-something-else&#39;, &#39;handler&#39;);
ログイン後にコピー

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

缓存

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

<?php
$dispatcher = FastRoute\cachedDispatcher(function(FastRoute\RouteCollector $r) {
    $r->addRoute(&#39;GET&#39;, &#39;/user/{name}/{id:[0-9]+}&#39;, &#39;handler0&#39;);
    $r->addRoute(&#39;GET&#39;, &#39;/user/{id:[0-9]+}&#39;, &#39;handler1&#39;);
    $r->addRoute(&#39;GET&#39;, &#39;/user/{name}&#39;, &#39;handler2&#39;);
}, [
    &#39;cacheFile&#39; => __DIR__ . &#39;/route.cache&#39;, /* required 缓存文件路径,必须设置 */
    &#39;cacheDisabled&#39; => 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, [&#39;GET&#39;, &#39;POST&#39;]]
ログイン後にコピー

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

/* Routing against GET /user/nikic/42 */
[FastRoute\Dispatcher::FOUND, &#39;handler0&#39;, [&#39;name&#39; => &#39;nikic&#39;, &#39;id&#39; => &#39;42&#39;]]
ログイン後にコピー

重写路由解析器和调度器

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

<?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: */
[
    [
        &#39;/user/&#39;,
        [&#39;id&#39;, &#39;\d+&#39;],
    ],
    [
        &#39;/user/&#39;,
        [&#39;id&#39;, &#39;\d+&#39;],
        &#39;/&#39;,
        [&#39;name&#39;, &#39;[^/]+&#39;],
    ],
]
ログイン後にコピー

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

调度程序通过构造函数接受路由数据,并提供 dispatch()方法。

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

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

<?php
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    /* ... */
}, [
    &#39;routeParser&#39; => &#39;FastRoute\\RouteParser\\Std&#39;,
    &#39;dataGenerator&#39; => &#39;FastRoute\\DataGenerator\\GroupCountBased&#39;,
    &#39;dispatcher&#39; => &#39;FastRoute\\Dispatcher\\GroupCountBased&#39;,
]);
ログイン後にコピー

上面给出了默认的设置,通过把 GroupCountBased 替换成 GroupPosBased 可以使用完全不同的调度策略

关于HEAD请求的说明

HTTP 规范要求服务器 同时支持 GET HEAD 方法

GETHEAD方法必须得到所有通用服务器的支持

ユーザーがリソースごとに HEAD ルートを手動で登録することを強制されないようにするため、リクエストは一致する GET ルートで応答されます。 PHP Web SAPI は、HEAD 応答からエンティティ本体を透過的に削除するため、この動作は大部分のユーザーに影響を与えません。

ただし、Web SAPI 環境の外で FastRoute を使用する場合は、HEAD リクエストに応じて生成されたエンティティ本文を決して送信してはなりません。SAPI 以外のユーザーの場合は、これを送信してください。ただし、FastRoute には HTTP の破壊を制限する力はありません。

最後に、アプリケーションは常に、特定のリソースに対して独自の HEAD メソッド ルートを指定して、この動作を完全にバイパスできることに注意してください。

推奨チュートリアル: 「PHP チュートリアル

以上がPHP ルーティング ライブラリ FastRoute の使用に関するチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles