Phrouteは興味深いパッケージです。これは、小規模から中程度のプロジェクトで簡単に実装できる速い正規表現ベースのルーターです。ただし、それは非常に高速ではありません。フィルター、フィルターグループ、名前付きルートがあります。物事が大きくなっている場合は、基本的なコントローラーシステムを使用することもできます。
とは、今日、それをどのように使用するか、そしてサンプルプロジェクトにその機能を実装する方法を見ていきます。また、私たちはボンネットの下にあるものを見るつもりです:Phrouteは、さまざまな人々による多くの実験とテストの結果です。最初からインストールしてみましょう!
キーテイクアウト
使用するデータベーススキームは次のとおりです
{ "require": { "phroute/phroute": "1.*" } }
いくつかのテストを行いたい場合、これは私が使用したSQLスキーマダンプです(いくつかの追加のダミーデータを使用して)。
特定のルートから始める前に、メインのアプリケーション構造を分析しましょう。これは、index.phpファイルに入れようとしているものです。
プロセスインプット、ProcessOutput、およびgetPDoInstanceの3つのユーティリティ方法があります。最初の2つを使用して、正しい入力と正しい出力を取得していることを確認します。 3番目は、必要なPDOインスタンスを準備します
注:Array_Sliceメソッドの2番目のパラメーターは、私の個人的な特定のプロジェクトのセットアップのために「3」です。ベースURLが変更されると変更します その後、Object $ Router、Routecontrollerクラスのインスタンスを使用してルートを宣言します。次に、マジックは$ dispatcher-> dispatch()メソッドで発生します。これは、$ _serverリクエストメソッド(get、postなど)と特定のリクエストURIの2つのパラメーターを取得します。この情報を使用して、ディスパッチャーは正しいルートを呼び出し、閉鎖でコードを実行します。返品値は、json文字列としてエコーするメソッドProcessOutput()に与えられる$ Responseveriableに保存されます。
ご覧のとおり、この特定の例では、単一のルートを宣言しました。こんにちは。注:ただし、必要に応じて、実際の構造を強化できます。新しいファイルを作成し、routes.phpを呼び出します。次に、$ routerオブジェクトの初期化の直後にメインindex.phpファイルからそれを含めます。すべてのルートが別のファイルにあります。私の意見では、よりエレガントなソリューション。
そう言った、あなたは私たちの例の基本構造についてあなたが必要とするすべてを知っています。
最初のルートを作りましょう!
ルート
単純なルート
最初の行では、ルート名、著者を宣言します。
ルートをテストしましょう。これが結果です。
{ "require": { "phroute/phroute": "1.*" } }
パラメーターの追加
今、私たちは一歩前進することができます:パラメーターを追加して、IDを考慮して、単一の著者の詳細を取得するのはどうでしょうか?
<span>CREATE TABLE IF NOT EXISTS authors (id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(250) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3; </span> <span>INSERT INTO authors (id, name) </span> <span>VALUES </span> <span>(1, 'Dan Brown'), </span> <span>(2, 'Paulo Coelho'); </span> <span>CREATE TABLE IF NOT EXISTS categories (id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(250) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3; </span> <span>INSERT INTO categories (id, name) </span> <span>VALUES </span> <span>(1, 'Thriller'), </span> <span>(2, 'Novel'); </span> <span>CREATE TABLE IF NOT EXISTS books (id int(10) unsigned NOT NULL AUTO_INCREMENT, title varchar(250) NOT NULL, isbn varchar(50) NOT NULL, year int(11) NOT NULL, pages int(11) NOT NULL, author_id int(10) unsigned NOT NULL, category_id int(10) unsigned NOT NULL, PRIMARY KEY (id), KEY author_id (author_id,category_id), KEY category_id (category_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7; </span> <span>INSERT INTO books (id, title, isbn, year, pages, author_id, category_id) </span> <span>VALUES </span> <span>(1, 'The Zahir', '0-06-083281-9', 2005, 336, 2, 2), </span> <span>(2, 'The Devil and Miss Prym', '0-00-711605-5', 2000, 205, 2, 2), </span> <span>(3, 'The Alchemist', '0-06-250217-4', 1988, 163, 2, 2), </span> <span>(4, 'Inferno', '978-0-385-53785-8', 2013, 480, 1, 1), </span> <span>(5, 'The Da Vinci Code', '0-385-50420-9', 2003, 454, 1, 1), </span> <span>(6, 'Angels & Demons', '0-671-02735-2', 2000, 616, 1, 1);</span>
ここに行きます:
「?」の追加パラメータープレースホルダーがオプションになることを意味します。もちろん、閉鎖宣言でデフォルト値を指定することをお勧めします。 異なる動詞を使用して
<span><span><?php </span></span><span> </span><span> <span>require 'vendor/autoload.php'; </span></span><span> </span><span> <span>function processInput($uri){ </span></span><span> <span>$uri = implode('/', </span></span><span> <span>array_slice( </span></span><span> <span>explode('/', $_SERVER['REQUEST_URI']), 3)); </span></span><span> </span><span> <span>return $uri; </span></span><span> <span>} </span></span><span> </span><span> <span>function processOutput($response){ </span></span><span> <span>echo json_encode($response); </span></span><span> <span>} </span></span><span> </span><span> <span>function getPDOInstance(){ </span></span><span> <span>return new PDO('mysql:host=localhost;dbname=booksapi;charset=utf8', 'root', ''); </span></span><span> <span>} </span></span><span> </span><span> <span>$router = new Phroute<span>\RouteCollector</span>(new Phroute<span>\RouteParser</span>); </span></span><span> </span><span> <span>$router->get('hello', function(){ </span></span><span> <span>return 'Hello, PHRoute!'; </span></span><span> <span>}); </span></span><span> </span><span> <span>$dispatcher = new Phroute<span>\Dispatcher</span>(router); </span></span><span> </span><span> <span>try { </span></span><span> </span><span> <span>$response = $dispatcher->dispatch($_SERVER['REQUEST_METHOD'], processInput($_SERVER['REQUEST_URI'])); </span></span><span> </span><span> <span>} catch (Phroute<span>\Exception\HttpRouteNotFoundException</span> $e) { </span></span><span> </span><span> <span>var_dump($e); </span></span><span> <span>die(); </span></span><span> </span><span> <span>} catch (Phroute<span>\Exception\HttpMethodNotAllowedException</span> $e) { </span></span><span> </span><span> <span>var_dump($e); </span></span><span> <span>die(); </span></span><span> </span><span> <span>} </span></span><span> </span><span> <span>processOutput($response);</span></span>
今まで、ルートを取得するだけで作成しました。他のhttp動詞はどうですか?
問題ありません。こちらをご覧ください:
<span>$router->get('authors', function(){ </span> <span>$db = getPDOInstance(); </span> <span>$sql = 'SELECT * FROM authors;'; </span> <span>$st = $db->prepare($sql, array(PDO<span>::</span>ATTR_CURSOR => PDO<span>::</span>CURSOR_FWDONLY)); </span> <span>$st->execute(); </span> <span>$result = $st->fetchAll(PDO<span>::</span>FETCH_CLASS); </span> <span>return $result; </span> <span>});</span>
実際、本のポストルートに入る人は誰でも、私たちのコレクションに新しい本を挿入できます。それはクールですが、これは物事が通常行くようではありません。ルートを保護したい場合はどうなりますか?フィルターは私たちが必要とするものです。
フィルターはルートに非常に似ています。フィルターがどこかで呼び出されると実行される名前と関連する閉鎖があります。
では、違いは何ですか?フィルターは、ルートの前(または後)に簡単に呼び出すことができます。フィルター
まず、$ルーターオブジェクトのフィルター()メソッドを使用してフィルターを宣言しました。構文はルートと同じです。適切なタイミングで実行される名前と閉鎖を提供しています。
{ "require": { "phroute/phroute": "1.*" } }
今それを決定しています。Post()メソッドに3番目のパラメーターを追加しました。この3番目のパラメーターは配列で、フィルターの名前(logged_in)で以前にキーを指定します。この瞬間から、すべての通話の前に本の投稿ルートに通話する前に、logged_inフィルター(およびその閉鎖コンテンツを実行した)も呼び出されます。 この特定のケースでは、ユーザーがログインしているかどうかを確認するために、セッションユーザー_ID変数をチェックしています。
ルート呼び出しの直後にフィルターを実行するために使用されるアフターキーもあります。これが例です。
必要な場合は、同時に複数のフィルターを指定することもできます。
あなたがしなければならないのは、単一の文字列の代わりに文字列の配列を使用することです。
フィルターグループ
<span>CREATE TABLE IF NOT EXISTS authors (id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(250) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3; </span> <span>INSERT INTO authors (id, name) </span> <span>VALUES </span> <span>(1, 'Dan Brown'), </span> <span>(2, 'Paulo Coelho'); </span> <span>CREATE TABLE IF NOT EXISTS categories (id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(250) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3; </span> <span>INSERT INTO categories (id, name) </span> <span>VALUES </span> <span>(1, 'Thriller'), </span> <span>(2, 'Novel'); </span> <span>CREATE TABLE IF NOT EXISTS books (id int(10) unsigned NOT NULL AUTO_INCREMENT, title varchar(250) NOT NULL, isbn varchar(50) NOT NULL, year int(11) NOT NULL, pages int(11) NOT NULL, author_id int(10) unsigned NOT NULL, category_id int(10) unsigned NOT NULL, PRIMARY KEY (id), KEY author_id (author_id,category_id), KEY category_id (category_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7; </span> <span>INSERT INTO books (id, title, isbn, year, pages, author_id, category_id) </span> <span>VALUES </span> <span>(1, 'The Zahir', '0-06-083281-9', 2005, 336, 2, 2), </span> <span>(2, 'The Devil and Miss Prym', '0-00-711605-5', 2000, 205, 2, 2), </span> <span>(3, 'The Alchemist', '0-06-250217-4', 1988, 163, 2, 2), </span> <span>(4, 'Inferno', '978-0-385-53785-8', 2013, 480, 1, 1), </span> <span>(5, 'The Da Vinci Code', '0-385-50420-9', 2003, 454, 1, 1), </span> <span>(6, 'Angels & Demons', '0-671-02735-2', 2000, 616, 1, 1);</span>
心配しないでください:フィルターグループがここにあります。
<span><span><?php </span></span><span> </span><span> <span>require 'vendor/autoload.php'; </span></span><span> </span><span> <span>function processInput($uri){ </span></span><span> <span>$uri = implode('/', </span></span><span> <span>array_slice( </span></span><span> <span>explode('/', $_SERVER['REQUEST_URI']), 3)); </span></span><span> </span><span> <span>return $uri; </span></span><span> <span>} </span></span><span> </span><span> <span>function processOutput($response){ </span></span><span> <span>echo json_encode($response); </span></span><span> <span>} </span></span><span> </span><span> <span>function getPDOInstance(){ </span></span><span> <span>return new PDO('mysql:host=localhost;dbname=booksapi;charset=utf8', 'root', ''); </span></span><span> <span>} </span></span><span> </span><span> <span>$router = new Phroute<span>\RouteCollector</span>(new Phroute<span>\RouteParser</span>); </span></span><span> </span><span> <span>$router->get('hello', function(){ </span></span><span> <span>return 'Hello, PHRoute!'; </span></span><span> <span>}); </span></span><span> </span><span> <span>$dispatcher = new Phroute<span>\Dispatcher</span>(router); </span></span><span> </span><span> <span>try { </span></span><span> </span><span> <span>$response = $dispatcher->dispatch($_SERVER['REQUEST_METHOD'], processInput($_SERVER['REQUEST_URI'])); </span></span><span> </span><span> <span>} catch (Phroute<span>\Exception\HttpRouteNotFoundException</span> $e) { </span></span><span> </span><span> <span>var_dump($e); </span></span><span> <span>die(); </span></span><span> </span><span> <span>} catch (Phroute<span>\Exception\HttpMethodNotAllowedException</span> $e) { </span></span><span> </span><span> <span>var_dump($e); </span></span><span> <span>die(); </span></span><span> </span><span> <span>} </span></span><span> </span><span> <span>processOutput($response);</span></span>
私たちのプロジェクトは成長しており、単一のファイルでコードベースを整理するのは非常に重く、ずさんです。コントローラーを使用するのはどうですか?
はい:Phrouteはルートだけではありません。物事が荒れ狂うとき、それはそれらを整理する時です。
<span>$router->get('authors', function(){ </span> <span>$db = getPDOInstance(); </span> <span>$sql = 'SELECT * FROM authors;'; </span> <span>$st = $db->prepare($sql, array(PDO<span>::</span>ATTR_CURSOR => PDO<span>::</span>CURSOR_FWDONLY)); </span> <span>$st->execute(); </span> <span>$result = $st->fetchAll(PDO<span>::</span>FETCH_CLASS); </span> <span>return $result; </span> <span>});</span>
まず、コントローラーの構造がどのようなものか見てみましょう。この例を見てください(routes.phpファイルに入れることができます):
著者クラスを作成しました。このクラスでは、getIndex()とpostAdd()。
コントローラー部品は開発の初期段階にあり、多くの改善が必要です。そのうちの1つは、コントローラーメソッドのパラメーターを定義する可能性です。または、たぶん、コントローラーのいくつかの方法に対してフィルターを定義する簡単な方法(「すべてか何もない」ではなく)。
結論Phrouteには非常に高速なルーターが付属しています。プロジェクトのGithubページでは、Laravelのコアルーターとの比較に関するいくつかの統計を確認できます。結果は驚くべきものです。最悪の場合、シナリオは約40(はい、40)速いです。 このルーターの背後にある「エンジン」に関する具体的な詳細を知りたい場合は、テスト、ベンチマーク、関連する結果を使用して、GitHubのNikicページにアクセスできます。
あなたはPhrouteを試してみませんか?あなたがそれについてどう思うか教えてください!よくあるPHPルーティングに関するよくある質問(FAQ)
PHPルーティングにおいて重要なのはなぜですか? PHPルーティングは、PHPアプリケーションのルートを定義するためのシンプルで便利な方法を提供するため、重要です。 Phrouteを使用すると、アプリケーション内の特定の機能またはメソッドにURLをマップして、コードの管理と整理を容易にすることができます。また、ルートパラメーターとフィルターをサポートしているため、アプリケーションがさまざまなURLにどのように応答するかをより詳細に制御できます。 PHPの依存関係管理ツールであるComposerを使用したPHPアプリケーション。公式Webサイトの指示に従ってComposerをインストールできます。 Composerをインストールしたら、端末で次のコマンドを実行してPhrouteをインストールできます。ComposerResect Phroute/Phroute。これにより、アプリケーションにPhrouteをダウンロードしてインストールします。
wrouteを使用してルートを定義するにはどうすればよいですか?最初に、PhrouterouteCollectorクラスのインスタンスを作成する必要があります。その後、このクラスのルートメソッドを使用して、ルートを定義できます。ルートメソッドには、HTTPメソッド(GET、投稿など)、URLパターン、およびハンドラー機能またはメソッドの3つのパラメーターが必要です。例は次のとおりです。
ルートパラメーターは、異なる可能性のあるURLの一部です。 Phrouteでは、ルートを定義するときにURLパターンにそれらを含めることにより、ルートパラメーターを定義できます。ルートパラメーターは、巻き毛のブレースに囲まれています{}。ルートが一致すると、ルートパラメーターの値が引数としてハンドラー関数またはメソッドに渡されます。例は次のとおりです。
$ router = new phrouteroutecollector();
$ router-> route( 'get'、 '/{id}'、function($ id){
return return 「ユーザーID:$ id ";
});
$ router = new phrouteroutecollector();
$ router-> filter( 'auth'、function(){
if(!sesset($ _ session ['user'] )){
}
} ['dashboardcontroller'、 'show']) - > before( 'auth');
404エラーで404エラーを処理するにはどうすればよいですか?これは、要求されたURLと一致しないルートがない場合に発生します。 PhrouterouteCollectorクラスの非表示方法を使用して、404ハンドラーを定義できます。 404ハンドラーは、404エラーが発生したときに呼び出される関数またはメソッドです。例は次のとおりです。
$ router = new phrouteroutecollector();
ルートでルートをディスパッチするにはどうすればよいですか?
ルートを定義したら、 phrouteroutedispatcherクラス。このクラスのディスパッチメソッドは、HTTPメソッドとURLをパラメーターとして取得し、一致したルートのハンドラー機能またはメソッドの結果を返します。例は次のとおりです。
$ Dispatcher = new Phrouteroutedispatcher($ router-> getData();
他のPHPでPhrouteを使用できますかフレームワーク? $ router-> route( 'get'、 '/{id}'、function($ id){ $ dispatcher = new Phrouteroutedispatcher($ router-> getData());
はい、他のPHPフレームワークでPhrouteを使用できます。 Phrouteはスタンドアロンライブラリです。つまり、特定のフレームワークに依存しないことを意味します。使用しているフレームワークに関係なく、任意のPHPアプリケーションで使用できます。ただし、フレームワークのルーティングシステムで動作するようにコードを適応させる必要がある場合があります。
return return 「ユーザーID:$ id ";
});
print_r($ router-> debug());
例外を処理するにはどうすればよいですかin phroute?
$ response = $ dispatcher-> dispatch($ _ server ['request_method']、 $ _SERVER ['request_uri']);
echo $ response;
} catch(例外$ e) {
}
以上がPhrouteを使用した高速PHPルーティングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。