首頁 > 後端開發 > 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應用程序。 可以在路由處理之前或之後使用phroute中的過濾器,為訪問控制和數據驗證提供功能強大的工具,增強安全性和數據完整性。 >
    > Phroute在路由性能方面表現出色,大大優於其他一些路由器,例如Laravel's,但目前缺乏高級控制器功能和全面的文檔,即確定的未來改進領域。
  • >安裝
  • >您可以在幾秒鐘內使用作曲家將Phroute添加到您的項目中。只需將此行添加到您的composer.json文件:
  • 鍵入Composer install命令,您正在加入。現在,讓我們繼續進行測試項目。 >
  • 示例項目和第一個示例
  • 為了更好地理解Phroute的每個概念,最好與示例項目一起工作。今天,我們將為書籍數據庫服務做一個基本的API。
  • 這是我們將要使用的數據庫方案:

如果您想進行一些測試,這是我使用的SQL模式轉儲(帶有一些額外的虛擬數據)。

>
{ 
        "require": 
        { 
            "phroute/phroute": "1.*" 
        } 
    }
登入後複製
登入後複製
登入後複製

我們不會寫任何真正複雜的東西。實際上,編寫一些以非常基本的方式模擬API請求的路線就足夠了。如果您想寫一個真實的API,您必須知道很多概念,但是今天我們只是看一下Phroute。

在我們從特定路線開始之前,讓我們分析主要的應用結構。這就是我們將要放入index.php文件中的內容。

>

我們有三種實用程序方法:ProcessInput,ProcessOutput和GetPdoInstance。我們將使用前兩個來確保我們獲得正確的輸入和正確的輸出。第三個將準備必要的PDO實例。

注意:由於我的個人特定項目設置,Array_Slice方法的第二個參數為“ 3”。隨著基本URL的變化而更改它。

在那之後,我們使用對象$路由器(RouteController類的實例)聲明路線。然後,魔術發生在$ dispatcher-> dispatch()方法中,該方法採用兩個參數:$ _server請求方法(獲取,發布等)和特定的請求URI。有了這些信息,調度員將調用正確的路線並在關閉中執行代碼。返回值存儲在$響應變量中,該變量給出了將其作為JSON字符串迴聲的方法processOutput()。 如您所見,在此特定示例中,我們聲明了一個路線:hello。

>注意:但是,如果需要,可以增強實際結構。創建一個新文件並調用routes.php。然後,在$路由器對像初始化之後,將其從Main Index.php文件中包含:您將在單獨的文件中使用所有路由。在我看來,一個更優雅的解決方案。

>

也就是說,您現在知道有關我們示例的基本結構所需的一切。 >

讓我們做我們的第一條路線!

>

路由

一個簡單的路線

好吧,讓我們看看我們可以通過路線以及可以為我們的需求定制多少路線。

我們是從最簡單的事情開始的:作者列表。

在第一行中,我們聲明了我們的路線名稱,作者。

>讓我們測試路線:這是結果。
{ 
        "require": 
        { 
            "phroute/phroute": "1.*" 
        } 
    }
登入後複製
登入後複製
登入後複製
>

好!

添加一個參數
<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>
登入後複製
登入後複製

>現在我們可以向前邁出一步:添加一個參數,以獲取單個作者的詳細信息,給定ID?

類似的東西:

>您可以使用{variable_name}佔位符傳遞參數,並以相同的選擇名稱作為閉合參數。在此示例中,我們有一個與$ id參數相對應的{id}佔位符。您可以指定所需的任何參數:無限制。

有時,參數是可選的。讓我們舉一個例子:如果我們使用書籍URL,我們想檢索所有數據庫書的列表。但是,如果我們指定ID之類的書籍/1,我們將獲得給定類別的書籍列表。

>

在這裡我們去:
<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>
登入後複製
登入後複製
沒問題。在這裡看看:

>讓我們做一個示例郵寄路線。是時候在我們的收藏中添加一本新書了!

>

>讓我們想像我們有一個表格可以填寫書籍數據:其動作屬性將指向我們現在創建的書籍路線!

>

>現在我們將邁出又一步:是時候“保護”我們的路線!

>過濾

實際上,進入書籍郵政路線的每個人都可以在我們的收藏中插入一本新書。這很酷,但這通常不像事情發生。如果我們想保護自己的路線怎麼辦?過濾器是我們需要的。

>過濾器與路線非常相似:它們具有名稱和關聯的閉合,當過濾器被稱為某個地方時執行。

>那麼,有什麼區別?可以在路由之前(或之後)輕鬆調用過濾器。

>

>過濾

讓我們以一個示例:

首先,我們用$路由器對象的filter()方法聲明了過濾器。語法與路線相同。我們給它一個名稱和封閉,將在正確的時間執行。
{ 
        "require": 
        { 
            "phroute/phroute": "1.*" 
        } 
    }
登入後複製
登入後複製
登入後複製
>

好,但是什麼是“正確的時間”?

我們現在正在決定:我們只是在post()方法中添加了第三個參數。第三個參數是一個數組,我們在其中使用過濾器的名稱(logged_in)指定鍵。從這一刻開始,在每次呼叫郵寄路由之前,也將調用logged_in filter(並執行其閉合內容)。

>

在這種特定情況下,我們正在檢查一個會話user_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>
登入後複製
登入後複製
>讓我們想像一個現實世界的案例:假設我們有三個郵政路線,一個針對每個實體(作者,書籍,類別)。添加logged_in濾波器三個不同的時間會很無聊。

>

不用擔心:濾鏡組在這裡提供幫助。

>

使用此組,我們為三個不同的路由定義了相同的濾鏡。

注意:如果需要,您也可以在其他組中嵌套成組。
<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>
登入後複製
登入後複製

增長項目?是時候使用控制器了!

>我們的項目正在成長,並在一個文件中組織我們的代碼庫真的很重,很草率。使用控制器呢?

>

是:phroute不僅與路線有關。當事情變得瘋狂時,是時候組織了它們了。

首先,讓我們看看控制器的結構是什麼樣的。看看這個示例(我們可以將其放在我們的routes.php文件中):>

我們創建了一個作者類。在此類中,我們放了兩種方法:getIndex()和postadd()。

> 然後,使用$ Router對象的Controller()方法,我們將作者URL鏈接到作者類。因此,如果我們在瀏覽器中輸入URL作者,則將自動調用GetIndex()方法。 postadd()方法也將綁定到作者/add(post)URL。

這個自動解析名稱功能非常有趣,但實際上還不夠。

>

>控制器部分處於開發的早期階段,需要進行許多改進。其中之一是可以為控制器方法定義參數。或者,也許是為某些控制器的某些方法定義過濾器的簡便方法(而不是“全部或全部”)。

>

結論

>有很多工作要做,尤其是在控制器方面。作為開發人員,我認為擁有一個通用的基本控制器類來處理所有骯髒的工作(使用過濾器,方法參數等)將是很棒的。也缺乏文檔。

另一方面,Phroute配備了一個非常快速的路由器。在項目的GitHub頁面上,您可以看到有關與Laravel的核心路由器進行比較的一些統計數據:結果很棒。在最壞的情況下

>如果您想了解該路由器背後的“引擎”的特定詳細信息,則可以訪問Github上的Nikic頁面,他在其中解釋了所有努力,並提供了測試,基準和相關結果。

您要嘗試phroute嗎?讓我知道您對此有何看法!

>常見問題(常見問題解答)有關使用PHROUTE

快速php路由的問題

什麼是phroute,為什麼在PHP路由中很重要?它在PHP路由中很重要,因為它提供了一種簡單便捷的方法來定義PHP應用程序中的路由。 PHROUTE允許您將URL映射到應用程序中的特定功能或方法,從而更容易管理和組織代碼。它還支持路由參數和過濾器,使您可以更多地控制應用程序如何響應不同的URL。

>

>我如何在我的PHP應用程序中安裝phroute?

>

phroute可以輕鬆地安裝在您的PHROUTE中PHP應用程序使用Composer,Composer是PHP的依賴關係管理工具。您可以在其官方網站上按照說明來安裝作曲家。安裝了作曲家後,您可以通過在終端中運行以下命令來安裝PHROUTE:COMPOSER需要Phroute/Phroute。這將在您的應用程序中下載並安裝phroute。

如何使用phroute?

使用Phroute定義路由很簡單。您首先需要創建一個PhrouterOuteCollector類的實例。然後,您可以使用此類的路由方法來定義路線。路由方法採用三個參數:HTTP方法(GET,POST等),URL模式和處理程序函數或方法。這是一個示例:

$ router = new phrouteroutecollector(); $ router-> route('get',','/uster/users/{id}',function($ id) “用戶ID:$ id”;

});

>如何使用phroute?

路由參數處理路由參數,路由參數是URL的一部分。在PHROUTE中,您可以在定義路由時將路由參數包括在URL模式中來定義路由參數。路由參數包含在捲曲括號{}中。匹配路由時,路由參數的值將傳遞給處理程序函數或方法作為參數。這是一個示例:

$ router = new phrouteroutecollector(); $ router-> route('get',','/uster/users/{id}',function($ id) “用戶ID:$ id”;
});

>如何將過濾器與phroute一起使用? PHROUTE是在匹配路線之前或之後運行的函數或方法。它們可用於執行身份驗證或輸入驗證等任務。您可以使用PhrouterOuteCollector類的過濾器方法來定義過濾器,並且可以使用前後方法將其應用於路由。這是一個示例:

$ router = new phrouteroutecollector();

$ router-> filter('auth',function',function(){

> if(! )){
返回false;
}
});
$ router-> route('get','/dashboard', ['dashboard Controller','show']) - >>>之前( 'auth');

>如何處理phroute的404錯誤?

$ router = new PhrouterOuteCollector();

$ router-> notfound(function(){返回'404- dege not -page not of endure';

});
>如何使用phroute?

派遣路由,一旦定義了路線,就可以使用phroute? PHROUTOROUTEDISPATCHER類。此類的調度方法將HTTP方法和URL作為參數,並返回匹配的路由的處理程序功能或方法的結果。這是一個示例:

$ dispatcher = new phrouteroutedispatcher($ router-> getData());

$ recession = $ dispatcher-> dispatcher-> dispatch($ _ server ['request_method'], $ _server [ ']));

echo $ response;


>我可以與其他phroute一起使用PHP Frameworks?

是的,您可以將PHROUTE與其他PHP框架一起使用。 Phroute是一個獨立的庫,這意味著它不依賴於任何特定的框架。無論您使用的框架如何,您都可以在任何PHP應用程序中使用它。但是,您可能需要調整代碼以與框架的路由系統一起工作。
>

>如何使用PhrouterOuteCollector類的調試方法來完成Phroute中的調試路由?此方法返回所有定義的路由的數組,這對於調試目的可能很有用。這是一個示例:

$ router = new phrouteroutecollector(); $ router-> route('get',','/uster/users/{id}',function($ id) “用戶ID:$ id”;
});
print_r($ router-> debug());

如何處理可以通過將您的調度代碼包裝在try-catch塊中來處理PhRoute?

的異常。如果在調度過程中拋出異常,則可以捕獲並適當處理它。以下是一個示例:

嘗試{

$ dispatcher = new phrouteroutedispatcher($ router-> getData()); $ recession = $ dispert = $ dispather-> dispatch($ _ servert( $ _ servers ['umplect_method''],'umplect_method'],,,,美元$ e){ echo'發生錯誤:'。 $ e-> getMessage();
}

以上是使用Phroute快速php路由的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板