也就是說,今天我們將看到如何使用它以及如何在示例項目中實現其功能。另外,我們將看到引擎蓋下的內容:Phroute是不同人進行的許多實驗和測試的結果。
讓我們從安裝它開始!鑰匙要點
PhRoute是一個高效的,基於正則義務的路由套件,非常適合中小型PHP項目,為較大應用提供過濾器,過濾器組和基本控制器系統等功能。
> 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></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>>讓我們想像一個現實世界的案例:假設我們有三個郵政路線,一個針對每個實體(作者,書籍,類別)。添加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();}); 路由參數處理路由參數,路由參數是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中文網其他相關文章!

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

ToretrievedatafromaPHPsession,startthesessionwithsession_start()andaccessvariablesinthe$_SESSIONarray.Forexample:1)Startthesession:session_start().2)Retrievedata:$username=$_SESSION['username'];echo"Welcome,".$username;.Sessionsareserver-si

利用會話構建高效購物車系統的步驟包括:1)理解會話的定義與作用,會話是服務器端的存儲機制,用於跨請求維護用戶狀態;2)實現基本的會話管理,如添加商品到購物車;3)擴展到高級用法,支持商品數量管理和刪除;4)優化性能和安全性,通過持久化會話數據和使用安全的會話標識符。

本文討論了PHP中的crypt()和password_hash()的差異,以進行密碼哈希,重點介紹其實施,安全性和對現代Web應用程序的適用性。

文章討論了通過輸入驗證,輸出編碼以及使用OWASP ESAPI和HTML淨化器之類的工具來防止PHP中的跨站點腳本(XSS)。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver CS6
視覺化網頁開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),