ホームページ > バックエンド開発 > PHPチュートリアル > Phrouteを使用した高速PHPルーティング

Phrouteを使用した高速PHPルーティング

Lisa Kudrow
リリース: 2025-02-20 12:25:16
オリジナル
130 人が閲覧しました

Phrouteを使用した高速PHPルーティング

Phrouteは興味深いパッケージです。これは、小規模から中程度のプロジェクトで簡単に実装できる速い正規表現ベースのルーターです。ただし、それは非常に高速ではありません。フィルター、フィルターグループ、名前付きルートがあります。物事が大きくなっている場合は、基本的なコントローラーシステムを使用することもできます。

とは、今日、それをどのように使用するか、そしてサンプルプロジェクトにその機能を実装する方法を見ていきます。また、私たちはボンネットの下にあるものを見るつもりです:Phrouteは、さまざまな人々による多くの実験とテストの結果です。

最初からインストールしてみましょう!

キーテイクアウト

Phrouteは、小規模から中程度のPHPプロジェクトに最適な非常に効率的で正規表現ベースのルーティングパッケージであり、フィルター、フィルターグループ、より大きなアプリケーション用の基本コントローラーシステムを提供します。
    Phrouteのインストールは、作曲家を使用して簡単で、プロジェクトのセットアップ速度とシンプルさを強化します。
  • Phrouteは、さまざまなHTTPメソッドをサポートし、オプションのパラメーターを使用した動的ルーティングを可能にし、API開発やその他のWebアプリケーションに汎用性があります。
  • wrouteのフィルターは、ルート処理の前後に適用でき、アクセス制御とデータ検証のための強力なツールを提供し、セキュリティとデータの整合性を向上させます。
  • Phrouteはルーティングパフォーマンスに優れており、Laravelのような他のいくつかのルーターを大幅に上回っていますが、現在、高度なコントローラー機能と包括的なドキュメント、将来の改善のために特定された領域がありません。
  • インストール
  • 数秒で作曲家と一緒にプロジェクトにPhrouteを追加できます。この行をcomposer.jsonファイルに追加するだけです:
  • Composer Installコマンドを入力してください。今すぐ、テストプロジェクトに進みましょう。
サンプルプロジェクトと最初の例

Phrouteのあらゆる概念をよりよく理解するためには、協力するサンプルプロジェクトを持つことをお勧めします。今日は、書籍データベースサービスの基本的なAPIを作成します。

使用するデータベーススキームは次のとおりです

{ 
        "require": 
        { 
            "phroute/phroute": "1.*" 
        } 
    }
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

いくつかのテストを行いたい場合、これは私が使用したSQLスキーマダンプです(いくつかの追加のダミーデータを使用して)。

私たちは本当に複雑なものを書くつもりはありません。実際、非常に基本的な方法でAPIリクエストをエミュレートするためのいくつかのルートを書くだけで十分です。現実世界のAPIを書きたい場合は、あなたが知っておくべき多くの概念がありますが、今日はPhrouteを見ているだけです。

特定のルートから始める前に、メインのアプリケーション構造を分析しましょう。これは、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.*" 
        } 
    }
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
great!

パラメーターの追加

今、私たちは一歩前進することができます:パラメーターを追加して、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>
ログイン後にコピー
ログイン後にコピー
そのようなもの:

{variable_name}プレースホルダーを使用してパラメーターを渡すことができます。これは、閉鎖のパラメーターと同じ選択名を持つものです。この例では、$ IDパラメーターに対応する{ID}プレースホルダーがあります。必要なパラメーターを指定できます:制限なし

パラメーターがオプションになる場合があります。別の例を挙げましょう:本のURLを使用する場合は、すべてのデータベースブックのリストを取得する必要があります。ただし、本/1のようなIDを指定すると、指定されたカテゴリの本リストが取得されます。

ここに行きます:

「?」の追加パラメータープレースホルダーがオプションになることを意味します。もちろん、閉鎖宣言でデフォルト値を指定することをお勧めします。 異なる動詞を使用して
<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>
ログイン後にコピー
ログイン後にコピー
現実世界のケースを想像してみましょう。すべてのエンティティ(著者、本、カテゴリ)に3つのポストルートがあるとしましょう。 logged_inフィルターを3つの異なる時間を追加するのは退屈です。


心配しないでください:フィルターグループがここにあります。

<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>
ログイン後にコピー
ログイン後にコピー
この単一のグループを使用して、3つの異なるルートで同じフィルターを定義しました。

注:必要な場合は、他のグループのグループを何度も好きなだけネストすることができます。

成長プロジェクト?コントローラーを使用する時間!

私たちのプロジェクトは成長しており、単一のファイルでコードベースを整理するのは非常に重く、ずさんです。コントローラーを使用するのはどうですか?

はい: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()。

次に、$ routerオブジェクトのコントローラー()メソッドを使用して、著者のURLを作成者クラスにリンクします。したがって、ブラウザでURL著者を入力すると、getIndex()メソッドが自動的に呼び出されます。 addd()メソッドについても同じことが言えますが、著者/add(post)urlにバインドされます。

この自動解像度の名前機能は非常に興味深いですが、実際には十分ではありません。

コントローラー部品は開発の初期段階にあり、多くの改善が必要です。そのうちの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つのパラメーターが必要です。例は次のとおりです。

$ router = new phrouteroutecollector();

$ router-> route( 'get'、 '/{id}'、function($ id){

return return 「ユーザーID:$ id ";

});

ルートパラメーターをfrouteで処理するにはどうすればよいですか?

ルートパラメーターは、異なる可能性のあるURLの一部です。 Phrouteでは、ルートを定義するときにURLパターンにそれらを含めることにより、ルートパラメーターを定義できます。ルートパラメーターは、巻き毛のブレースに囲まれています{}。ルートが一致すると、ルートパラメーターの値が引数としてハンドラー関数またはメソッドに渡されます。例は次のとおりです。

$ router = new phrouteroutecollector();
$ router-> route( 'get'、 '/{id}'、function($ id){
return return 「ユーザーID:$ id ";
});

with floute?ルートの前後に実行される関数またはメソッドが一致します。これらは、認証や入力検証などのタスクを実行するために使用できます。 PhrouterouteCollectorクラスのフィルターメソッドを使用してフィルターを定義でき、前後の方法を使用してルートに適用できます。例は次のとおりです。

$ router = new phrouteroutecollector();
$ router-> filter( 'auth'、function(){
if(!sesset($ _ session ['user'] )){ return false;
}
} ['dashboardcontroller'、 'show']) - > before( 'auth');

404エラーで404エラーを処理するにはどうすればよいですか?これは、要求されたURLと一致しないルートがない場合に発生します。 PhrouterouteCollectorクラスの非表示方法を使用して、404ハンドラーを定義できます。 404ハンドラーは、404エラーが発生したときに呼び出される関数またはメソッドです。例は次のとおりです。

$ router = new phrouteroutecollector();

$ router-> notfound(function(){

return '404-ページは見つかりません';

};


ルートでルートをディスパッチするにはどうすればよいですか?

ルートを定義したら、 phrouteroutedispatcherクラス。このクラスのディスパッチメソッドは、HTTPメソッドとURLをパラメーターとして取得し、一致したルートのハンドラー機能またはメソッドの結果を返します。例は次のとおりです。

$ Dispatcher = new Phrouteroutedispatcher($ router-> getData();

$ response = $ dispatcher-> dispatch($ _ server ['request_method']、$ _server ['request_uri ']);

echo $ response;

他のPHPでPhrouteを使用できますかフレームワーク?

はい、他のPHPフレームワークでPhrouteを使用できます。 Phrouteはスタンドアロンライブラリです。つまり、特定のフレームワークに依存しないことを意味します。使用しているフレームワークに関係なく、任意のPHPアプリケーションで使用できます。ただし、フレームワークのルーティングシステムで動作するようにコードを適応させる必要がある場合があります。 frouteでルートをデバッグするにはどうすればよいですか?この方法は、定義されたすべてのルートの配列を返します。これは、デバッグの目的に役立ちます。例は次のとおりです。

$ router = new phrouteroutecollector();

$ router-> route( 'get'、 '/{id}'、function($ id){
return return 「ユーザーID:$ id ";
});
print_r($ router-> debug());

例外を処理するにはどうすればよいですかin phroute?

ディスパッチコードをトライキャッチブロックにラッピングすることで、flouteの例外を処理できます。ディスパッチプロセス中に例外がスローされている場合は、キャッチして適切に処理できます。例は次のとおりです。

try {

$ dispatcher = new Phrouteroutedispatcher($ router-> getData());
$ response = $ dispatcher-> dispatch($ _ server ['request_method']、 $ _SERVER ['request_uri']);
echo $ response;
} catch(例外$ e) { echo 'エラーが発生しました:'。 $ e-> getMessage();
}

以上がPhrouteを使用した高速PHPルーティングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート