中間件是一種軟體設計模式,可實現不同系統、應用程式或服務之間的無縫通訊和資料交換。它在促進不同組件之間的交互、添加功能和增強整體系統性能方面發揮著至關重要的作用。
在我們先前的專案中,我們遇到了一個問題,即已登入的使用者在造訪註冊頁面時被要求重新註冊。這是由於缺乏中間件實現,導致用戶體驗不佳。
在PHP中,中介軟體可用於處理使用者註冊和登入功能,確保流暢的使用者體驗。中間件充當不同組件之間的橋樑,實現無縫通訊和資料交換。
if ($_SESSION['user'] ?? false){ header('location: /'); exit(); }
它檢查使用者是否登入。如果沒有,則退出腳本以查找經過身份驗證的使用者。
在routes.php檔案中,我們可以在路由中新增一個「guest」鍵,將其與中間件關聯起來:
$router->get('/register', 'controllers/registration/create.php')->only('guest');
要檢查項目是否如預期運作,可以在唯一方法中加入偵錯語句:
public function only($key){ dd($key); }
它顯示錯誤,因為唯一的方法不能使用 null 值,因為它與 get 方法關聯並且不傳回任何值。所以我們必須重寫這個方法。
要將所有值傳回唯一的方法,我們需要將 router.php 檔案中的 add 方法重寫為:
public function add($method, $uri, $controller) { $this->routes[] = [ 'uri' => $uri, 'controller' => $controller, 'method' => $method, 'middleware'=>null ]; return $this; }
現在我們可以看到該專案運作良好。
router.php 檔案中唯一需要修改的方法來接受中介軟體金鑰:
public function only($key){ $this->routes[array_key_last($this->routes)]['middleware']=$key; return $this; }
在create.php檔案中,我們可以使用中間件檢查使用者是否已登入或訪客:
if ($route['middleware']==='guest'){ if($_SESSION['user'] ?? false){ header('location: /'); exit(); } } if ($route['middleware']==='auth'){ if(! $_SESSION['user'] ?? false){ header('location: /'); exit(); } }
只有經過驗證的使用者才能存取所有頁面,而訪客只能存取有限的頁面。
要組織我們的中間件類,請在核心資料夾中建立一個名為 Middleware 的新目錄。因為我們必須在某個時刻做出改變才能放鬆,以節省我們的精力和時間。透過這個我們可以使我們的專案更容易理解。在此建立 3 個不同的類別。
Authenticated.php 檔案檢查使用者是否已登錄,如果為 true,則會重新導向至首頁:
<?php namespace Core\Middleware; class Authenticated { public function handle() { if (! $_SESSION['user'] ?? false) { header('location: /'); exit(); } } }
Guest.php 檔案檢查使用者是否未登錄,如果為 true,則重新導向至首頁:
<?php namespace Core\Middleware; class Guest { public function handle() { if ($_SESSION['user'] ?? false) { header('location: /'); exit(); } } }
Middleware.php 檔案使用 MAP 常數將中間件鍵對應到各自的類別。也檢查中間件是否存在。如果沒有,則向使用者顯示未捕獲的異常以在項目中添加中間件:
<?php namespace Core\Middleware; class Middleware { public const MAP = [ 'guest' => Guest::class, 'auth' => Authenticated::class ]; public static function resolve($key) { if (!$key) { return; } $middleware = static::MAP[$key] ?? false; if (!$middleware) { throw new \Exception("No matching middleware found for key '{$key}'."); } (new $middleware)->handle(); } }
現在我們可以看到,透過進行這些更改,我們的專案運作良好。
希望您已經清楚地理解了。
以上是中介軟體簡介的詳細內容。更多資訊請關注PHP中文網其他相關文章!