建登錄守衛(wèi):組件級(jí)中間件完整指南)
如何用Viewi構(gòu)建登錄守衛(wèi)組件級(jí)中間件完整指南【免費(fèi)下載鏈接】viewiUnique and efficient front-end framework for PHP項(xiàng)目地址: https://gitcode.com/gh_mirrors/vi/viewiViewi 是一款獨(dú)特的 PHP 前端框架Unique and efficient front-end framework for PHP。它內(nèi)置的組件級(jí)中間件Middleware機(jī)制讓你只需一個(gè)類(lèi)、一行屬性就能為任意頁(yè)面組件添加登錄守衛(wèi)Login Guard在組件渲染前攔截未登錄用戶無(wú)需手寫(xiě)任何路由判斷邏輯。為什么需要登錄守衛(wèi) 傳統(tǒng)做法是在每個(gè)受保護(hù)頁(yè)面里手動(dòng)判斷用戶是否登錄代碼重復(fù)且容易遺漏。Viewi 把守衛(wèi)做成組件屬性? 聲明式在組件類(lèi)上一行聲明無(wú)需侵入頁(yè)面邏輯? 組件級(jí)生效守衛(wèi)只對(duì)綁定的組件起作用粒度比全站中間件更細(xì)? 可組合一個(gè)組件可掛多個(gè)守衛(wèi)按順序執(zhí)行客戶端渲染入口 renderApp.ts 會(huì)在組件渲染前先跑完整個(gè)守衛(wèi)鏈任何一個(gè)守衛(wèi)拒絕next(false)組件就不會(huì)被渲染。3步搭建登錄守衛(wèi)第1步安裝 Viewigit clone https://gitcode.com/gh_mirrors/vi/viewi第2步編寫(xiě)守衛(wèi)類(lèi)守衛(wèi)只需實(shí)現(xiàn) IMIddleware 接口在run()方法中調(diào)用next()決定是否放行use Viewi\Components\Middleware\IMIddleware; use Viewi\Components\Middleware\IMIddlewareContext; use Viewi\Components\Browser\BrowserSession; use Viewi\Components\Routing\ClientRoute; class AuthGuard implements IMIddleware { public function __construct( private BrowserSession $session, private ClientRoute $route ) {} public function run(IMIddlewareContext $c) { $user $this-session-getItem(user); if ($user null) { $this-route-navigate(/login); // 跳轉(zhuǎn)登錄頁(yè) $c-next(false); // 攔截 return; } $c-next(true); // 放行 } } 小技巧Viewi 的 BrowserSession 可讀寫(xiě)瀏覽器 sessionStorageClientRoute 負(fù)責(zé)頁(yè)面跳轉(zhuǎn)兩者可直接注入守衛(wèi)構(gòu)造函數(shù)。第3步把守衛(wèi)綁定到組件使用 Middleware 屬性 聲明式綁定一行搞定use Viewi\Components\Attributes\Middleware; #[Middleware([AuthGuard::class])] class DashboardPage extends BaseComponent { // 未登錄時(shí)這個(gè)頁(yè)面根本不會(huì)渲染 }構(gòu)建時(shí)Builder 會(huì)自動(dòng)解析Middleware屬性把守衛(wèi)清單寫(xiě)入組件元數(shù)據(jù)并在客戶端渲染前按序執(zhí)行——整個(gè)過(guò)程零配置。帶參數(shù)的守衛(wèi)一份代碼多處復(fù)用 守衛(wèi)支持參數(shù)化綁定在類(lèi)名后追加位置參數(shù)Viewi 會(huì)自動(dòng)按構(gòu)造函數(shù)參數(shù)名注入。class RoleGuard implements IMIddleware { public function __construct(public string $role) {} public function run(IMIddlewareContext $c) { // 只允許 $role 角色訪問(wèn) $c-next(checkRole($this-role)); } } #[Middleware([[RoleGuard::class, admin]])] class AdminPage extends BaseComponent {} #[Middleware([AuthGuard::class, [RoleGuard::class, editor]])] class EditPage extends BaseComponent {}注意兩點(diǎn)寫(xiě)法含義Class::class字符串無(wú)參數(shù)守衛(wèi)[Class::class, 參數(shù)1, ...]數(shù)組帶參數(shù)守衛(wèi)參數(shù)按構(gòu)造函數(shù)形名注入一個(gè)組件可以同時(shí)掛多個(gè)守衛(wèi)從左到右依次執(zhí)行任一項(xiàng)攔截即終止。登錄守衛(wèi)最佳實(shí)踐清單只攔截、少渲染next(false)后客戶端會(huì)直接停止渲染配合navigate()跳轉(zhuǎn)登錄頁(yè)體驗(yàn)最佳復(fù)用守衛(wèi)用參數(shù)化守衛(wèi)如 RoleGuard避免為每種權(quán)限寫(xiě)一個(gè)新類(lèi)登錄頁(yè)保持無(wú)守衛(wèi)給登錄頁(yè)加AuthGuard會(huì)造成跳轉(zhuǎn)死循環(huán)?守衛(wèi)內(nèi)保持輕量守衛(wèi)在每次組件渲染前執(zhí)行避免在其中做耗時(shí) IO常見(jiàn)問(wèn)題排查 ?Q守衛(wèi)不生效頁(yè)面還是渲染了檢查Middleware屬性是否寫(xiě)在組件類(lèi)上它只支持Attribute::TARGET_CLASS且守衛(wèi)類(lèi)已實(shí)現(xiàn)IMIddleware接口。Q攔截后頁(yè)面空白沒(méi)有跳轉(zhuǎn)確保在next(false)之前調(diào)用了$route-navigate(/login)或自行處理重定向。Q多個(gè)守衛(wèi)的執(zhí)行順序按#[Middleware([...])]數(shù)組中的聲明順序依次執(zhí)行全部next(true)才會(huì)渲染組件見(jiàn) renderApp.ts 中的守衛(wèi)鏈實(shí)現(xiàn)。核心源碼路徑速查文件作用Middleware.php組件級(jí)守衛(wèi)聲明屬性IMIddleware.php守衛(wèi)接口定義IMIddlewareContext.phpnext(bool)放行/攔截上下文Builder.php構(gòu)建期解析守衛(wèi)清單routes.php路由注冊(cè)示例可放登錄頁(yè)路由掌握這套機(jī)制后登錄守衛(wèi)、角色權(quán)限、功能開(kāi)關(guān)等場(chǎng)景都可以用同一個(gè)模式優(yōu)雅解決——這正是 Viewi 高效理念的體現(xiàn)?!久赓M(fèi)下載鏈接】viewiUnique and efficient front-end framework for PHP項(xiàng)目地址: https://gitcode.com/gh_mirrors/vi/viewi創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考