也就是說,今天我們將看到如何使用它以及如何在示例項目中實現其功能。另外,我們將看到引擎蓋下的內容:Phroute是不同人進行的許多實驗和測試的結果。
讓我們從安裝它開始!鑰匙要點
PhRoute是一個高效的,基於正則義務的路由套件,非常適合中小型PHP項目,為較大應用提供過濾器,過濾器組和基本控制器系統等功能。
如果您想進行一些測試,這是我使用的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>
>
使用此組,我們為三個不同的路由定義了相同的濾鏡。
注意:如果需要,您也可以在其他組中嵌套成組。<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>
增長項目?是時候使用控制器了!
>我們的項目正在成長,並在一個文件中組織我們的代碼庫真的很重,很草率。使用控制器呢?
>我們創建了一個作者類。在此類中,我們放了兩種方法: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。}); 路由參數處理路由參數,路由參數是URL的一部分。在PHROUTE中,您可以在定義路由時將路由參數包括在URL模式中來定義路由參數。路由參數包含在捲曲括號{}中。匹配路由時,路由參數的值將傳遞給處理程序函數或方法作為參數。這是一個示例: > if(! )){ }); $ router = new phrouteroutecollector(); $ dispatcher = new phrouteroutedispatcher($ router-> getData()); >如何使用phroute?
$ router = new phrouteroutecollector();
});
>如何將過濾器與phroute一起使用? PHROUTE是在匹配路線之前或之後運行的函數或方法。它們可用於執行身份驗證或輸入驗證等任務。您可以使用PhrouterOuteCollector類的過濾器方法來定義過濾器,並且可以使用前後方法將其應用於路由。這是一個示例: $ router = new phrouteroutecollector();
$ router-> filter('auth',function',function(){
返回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作為參數,並返回匹配的路由的處理程序功能或方法的結果。這是一個示例: $ recession = $ dispatcher-> dispatcher-> dispatch($ _ server ['request_method'], $ _server [ ']));
echo $ response;
>我可以與其他phroute一起使用PHP Frameworks?
是的,您可以將PHROUTE與其他PHP框架一起使用。 Phroute是一個獨立的庫,這意味著它不依賴於任何特定的框架。無論您使用的框架如何,您都可以在任何PHP應用程序中使用它。但是,您可能需要調整代碼以與框架的路由系統一起工作。
>>如何使用PhrouterOuteCollector類的調試方法來完成Phroute中的調試路由?此方法返回所有定義的路由的數組,這對於調試目的可能很有用。這是一個示例:
});
print_r($ router-> debug());
如何處理可以通過將您的調度代碼包裝在try-catch塊中來處理PhRoute?
}
以上是使用Phroute快速php路由的詳細內容。更多資訊請關注PHP中文網其他相關文章!