PHP主|使用Slim中間件
Slim 框架的中間件:構建強大的 PHP 微型應用
Slim 是一個功能強大的 PHP 微型框架,其中間件功能允許在應用中實現各種過濾器式服務,例如身份驗證和緩存。中間件封裝應用程序,並能影響應用程序的環境以及請求和響應對象。
關鍵要點:
- Slim 的中間件是一個強大的特性,允許實現各種過濾器式服務,如身份驗證和緩存。中間件封裝應用程序,並能影響應用的環境、請求和響應對象。
- 在 Slim 中實現中間件,需要編寫一個擴展
SlimMiddleware
類並重寫call()
方法的類。此方法是中間件的入口點,可以從中返回(中斷執行流程)或調用下一層。然後,中間件可以操作響應的標頭和正文。 - 使用 Slim 的
add()
方法註冊 Slim 應用程序中的中間件。可以通過後續調用add()
方法註冊多個中間件。必須以與調用順序相反的順序添加中間件,因為新的中間件會圍繞任何先前添加的中間件。中間件的配置通常通過服務的構造函數完成。
Slim 中間件的理解
Slim 文檔將 Slim 應用程序比作洋蔥,洋蔥的每一層都是中間件。這是一個恰當的比喻。為了更好地理解它,讓我們假設我們正在編寫一個使用身份驗證和緩存的應用程序。我們的架構可能如下所示:
負責生成頁面內容的代碼被包裝在幾層中間件中,最重要的是身份驗證邏輯和緩存邏輯。執行流程經過每一層,要么允許流向下一層,要么被轉移。首先檢查用戶是否已通過身份驗證。如果沒有,則中斷流程並返回 HTTP 401 狀態。然後檢查是否可以使用內容的緩存副本。如果是,則使用緩存的頁面副本中斷流程。可能存在其他中間件層,直到流程最終到達負責生成頁面的邏輯。當我們的中間件方法返回時,執行流程會通過它們冒泡返回。例如,緩存中間件的其餘邏輯將緩存頁面的內容以供以後查找。
中間件的實現
要了解如何實現自定義中間件,讓我們看看可以作為上面提到的緩存中間件的代碼。實現任何基本 Slim 中間件組件的要求實際上非常少。我們只需要編寫一個擴展 SlimMiddleware
類並重寫 call()
方法的類。中間件的入口點是此 call()
方法,我們可以從中返回(從而中斷執行流程)或調用下一層。
<?php namespace MyMiddleware; class Cache extends SlimMiddleware { protected $db; public function __construct(PDO $db) { $this->db = $db; } public function call() { $key = $this->app->request()->getResourceUri(); $rsp = $this->app->response(); $data = $this->fetch($key); if ($data) { // 缓存命中...返回缓存的内容 $rsp["Content-Type"] = $data["content_type"]; $rsp->body($data["body"]); return; } // 缓存未命中...继续生成页面 $this->next->call(); if ($rsp->status() == 200) { // 缓存结果以供将来查找 $this->save($key, $rsp["Content-Type"], $rsp->body()); } } protected function fetch($key) { $query = "SELECT content_type, body FROM cache WHERE key = " . $this->db->quote($key); $result = $this->db->query($query); $row = $result->fetch(PDO::FETCH_ASSOC); $result->closeCursor(); return $row; } protected function save($key, $contentType, $body) { $query = sprintf("INSERT INTO cache (key, content_type, body) VALUES (%s, %s, %s)", $this->db->quote($key), $this->db->quote($contentType), $this->db->quote($body) ); $this->db->query($query); } }
call()
方法首先檢查內容是否在緩存中可用。如果是,它設置響應的 Content-Type
標頭和正文,然後返回,從而短路管道。如果緩存未命中,則調用 $this->next->call()
來調用下一個中間件層。當流程從其他中間件調用返回到這一點時,會快速檢查請求狀態,並將相關數據緩存以供將來查找。因為該類擴展了 Slim 的 Middleware
類,所以它可以通過 $this->app
訪問 Slim 應用程序的實例,從而間接訪問響應和請求對象。我們可以通過將其視為數組來影響響應的標頭,並通過其 body()
方法影響響應的正文。 fetch()
和 save()
方法是受保護的輔助方法,它們只是包裝數據庫查詢以查找和持久化內容。我在這裡包含它們只是為了完成示例。它假設存在一個名為 cache
的表,其中包含 key
、content_type
和 body
列。根據您的需要,您的持久性機制可能有所不同。此外,此處未顯示(為簡單起見)緩存過期,儘管您可以自己輕鬆地合併它。
中間件的註冊和配置
使用 Slim 的 add()
方法註冊中間件。
<?php require_once "../vendor/autoload.php"; $app = new SlimSlim(); $app->add(new MyMiddlewareCache($db));
當然,可以通過後續調用 add()
方法註冊多個中間件。因為新的中間件會圍繞任何先前添加的中間件,這意味著必須以與調用順序相反的順序添加它們。
<?php $app = new SlimSlim(); $app->add(new MyMiddlewareCache($db)); $app->add(new MyMiddlewareAuth($db)); // ...
在上面的示例中,Cache
中間件包裝了 Slim 應用,然後 Auth
中間件包裝了 Cache
。當調用 $app->run()
時,執行流程將類似於上圖所示,首先進入身份驗證中間件,然後一直向下工作到路由。中間件的配置通常通過服務的構造函數完成。在我們的示例中,我只是傳遞了一個活動的數據庫連接,以便它可以訪問緩存表,但是您可以編寫您的類以接受您可能需要自定義其行為的任何信息。例如,可以重寫該組件以接受一個公開fetch()
和save()
方法的處理程序對象;這將允許我們刪除示例方法(或將它們用作默認回退),並且最終用戶開發人員將根據其需求提供功能作為組件配置的一部分。
結論
我發現中間件是實現 Slim 應用程序各個方面的優雅解決方案。在本文中,我解釋了中間件架構的工作原理以及實現自己的中間件所需的條件。有一個小型額外存儲庫,其中包含一些基本的中間件示例,例如 CSRF 保護和 HTTP 身份驗證。我已經重構了這裡的示例並提交了一個拉取請求,因此,如果您編寫了一個有用的中間件服務,為什麼不考慮將其提交到項目中,以便其他人也能從中受益呢?
(圖片來自 Fotolia)
(以下為FAQ,已根據原文內容調整和補充,並精簡部分重複內容)
關於 Slim 中間件的常見問題
-
什麼是 Slim 中間件,為什麼它很重要? Slim 中間件是 Slim 框架中一個強大的工具,允許您操作 HTTP 請求和響應。它很重要,因為它提供了一種在 Slim 應用程序之前和之後執行代碼的方法,以修改傳入的請求或傳出的響應。這可用於各種目的,例如身份驗證、緩存或日誌記錄。
-
如何在 Slim 中創建中間件? 在 Slim 中創建中間件涉及定義一個實現
MiddlewareInterface
的類。此類應該有一個名為process()
的方法,該方法接收ServerRequestInterface
和RequestHandlerInterface
。process()
方法是您可以操作請求和響應的地方。 -
如何將中間件添加到我的 Slim 應用程序? 可以使用
add()
方法將中間件添加到您的 Slim 應用程序。此方法接收中間件類的實例。中間件按添加順序執行,因此最後添加的中間件將是第一個執行的中間件。 -
我可以將中間件用於 Slim 中的特定路由嗎? 是的,中間件可以應用於 Slim 中的特定路由。這是通過在
Route
對象而不是App
對像上調用add()
方法來完成的。這允許您擁有僅影響某些路由的中間件。 -
全局中間件和路由中間件有什麼區別? 全局中間件應用於 Slim 應用程序處理的每個請求,而路由中間件僅應用於特定路由。這允許您為應用程序的不同部分使用不同的中間件。
-
如何使用中間件進行 Slim 中的錯誤處理? 通過在中間件類中捕獲異常,可以使用中間件進行 Slim 中的錯誤處理。然後,您可以修改響應以包含錯誤信息,或將用戶重定向到錯誤頁面。
-
可以使用中間件在 Slim 中對用戶進行身份驗證嗎? 是的,中間件通常用於 Slim 中的身份驗證。這可以通過檢查中間件中的有效會話或令牌來完成,如果用戶未經身份驗證,則返回錯誤響應。
-
如何使用中間件在 Slim 中進行日誌記錄? 通過將有關請求和響應的信息寫入日誌文件,可以使用中間件進行日誌記錄。這對於調試或監視您的應用程序非常有用。
-
我可以將第三方中間件與 Slim 一起使用嗎? 是的,Slim 支持第三方中間件。這可以像您自己的中間件一樣添加到您的應用程序中。這允許您利用現有的中間件來完成常見任務。
-
如何測試我的 Slim 中間件? 測試 Slim 中間件涉及創建模擬請求和響應,並將它們傳遞給您的中間件。然後,您可以斷言中間件的行為符合預期,例如修改請求或響應,或拋出異常。
以上是PHP主|使用Slim中間件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

在PHPOOP中,self::引用當前類,parent::引用父類,static::用於晚靜態綁定。 1.self::用於靜態方法和常量調用,但不支持晚靜態綁定。 2.parent::用於子類調用父類方法,無法訪問私有方法。 3.static::支持晚靜態綁定,適用於繼承和多態,但可能影響代碼可讀性。

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。
