Ground Sunlight

Windowsで作る - PHPプログラミングの開発環境

ユーザ用ツール

サイト用ツール


サイドバー

メインメニュー

XAMPP アレンジ

IED

WSL2

道具箱

リポジトリ編

フレームワーク編

公開ソフトウェア

メタ
リンク


このページへのアクセス
今日: 1 / 昨日: 0
総計: 2403

basic-library:fast-route:1.3

リクエストルーター - FastRoute

FastRouteについて

FastRouteは、PHPコアの開発者の1人でもある Nikita氏が開発し、Slim フレームワークにも採用されている高速なリクエストリーターです。興味のある方は、なぜ高速であるかを説明するNikita氏のブログ投稿もご覧下さい。

リクエストリーターの選定に当たっては、最近の人気、実行速度、コードの品質から選びました。コードの品質についてはAwesome PHPを参考にしました。結果的に次の3つの候補から選びました:

機能面を考えるとKleinとAltoRouterも捨てがたい魅力がありましたが、ORマッパーと同じく「兎に角シンプル」と「学習コストが少ない」そして何よりも高速という理由でFastRoute を採用することにしました。

インストール

composer require nikic/fast-route
Using version ^1.3 for nikic/fast-route
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing nikic/fast-route (v1.3.0): Downloading (100%)
Writing lock file
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!
Note:
Eclipse起動中にパッケージを取得した場合は、プロジェクト・エクスプローラー内の[プロジェクト(apricote)]を右クリックして[リフレッシュ]を選択して下さい。また、新しく取得したパッケージのインテリセンスが有効にならない場合は、プロジェクトのビルトまたはクリーン&ビルドを行ってビルドリストの更新を行って下さい。

パッケージの取得が終わると composer.jsonrequire に以下が追加されます。

composer.json
{
    "require": {
        "nikic/fast-route": "^1.3"
    }
}


テストプログラム

テストフォルダ(test\)に フォルダ(fast-route) を作成し、そのフォルダに .htaccess と テストコード(index.php)を作成し実行します。.htaccessでは rewrite を使って test\fast-route\ 下への全ての(実在するディレクトリとファイを除く)リクエストをフロントプロセッサーである index.php に転送します。

.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ index.php [L]
</IfModule>

以下にテストコード('index.php')を示します。この例は、FastRouteサイトのUsageにある基本的な使用例を追加・修正したものです。本例の詳細はコード内のコメントをご覧ください。

大まかな流れは「REQUEST_METHODREQUEST_URI でルーティングの定義を行い、それに従い dispatch() して制御をハンドラーに渡す」と言うものですが、この例ではハンドラーとして(名前のある)関数とクロージャ―(無名関数)を使いました。クラスのインスタンスメソッドの例は、Apricotをご覧下さい。

index.php
<?php
require __DIR__.'/../../vendor/autoload.php';
 
// 自分(index.php)の場所を取得する
$base = dirname($_SERVER['SCRIPT_NAME']);
if (preg_match('/^[\\.\\\\]$/', $base)) $base='';
 
// ルーティング(コールバック関数)の定義
// ルーティングは、get(path,handler),post(path,handler) の形式で指定する
// (*1)handlerにcallable型を指定した
// (*2)ベースとなるURLが同じなのでaddGroup()を使った)
$routes = function (FastRoute\RouteCollector $r) use($base)
{
    $r->addGroup($base, function (FastRoute\RouteCollector $r) use($base)
    {
        // handlerに関数を指定する
        $r->get('/users', 'users');          // 単純なルーティング
        $r->get('/user/{id:\d+}', 'user');   // プレースフォルダ(名前:id)
        $r->get('/articles/{id:\d+}[/{title}]', 'articles');  // 任意のプレースフォルダ
 
        // handlerにクロージャを指定する
        $r->get('[/]', function() use($base)
        {
            header("Location: " . $base.'/users');
        });
    });
};
 
$dispatcher = FastRoute\simpleDispatcher($routes);
 
// dispatch()に与えるHTTPメソッドとURIを取得
$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];
 
// dispatch()の妨げになるのでURIの中のクエリパラメータを除去する
// (クエリパラメータは、通常に$_GETで取得できる)
if (false !== ($pos = strpos($uri, '?'))) {
    $uri = substr($uri, 0, $pos);
}
// URIの中にクエリパラメータがあるかもしれないのでデコードする
// 例) /hoge/hoge/param/abc%20def
$uri = rawurldecode($uri);
 
// 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]; // ハンドラー 例)user
        $params = $routeInfo[2];  // パラメータハッシュ 例)['id'->123]
 
        // ハンドラーを呼び出す
        if (is_callable($handler))
        {
            call_user_func_array($handler, $params);
        }
        break;
}
 
// Handler: users
function users()
{
    echo "users";
}
 
// Handler: user
function user(int $id)
{
    echo "user({$id})";
}
 
// Handler: articles
function articles(int $id, string $title=null)
{
    echo "articles({$id}){$title}";
}


コメント

コメントを入力. Wiki文法が有効です:
 
basic-library/fast-route/1.3.txt · 最終更新: 2020/07/14 15:36 by y2sunlight