如何用Viewi构建登录守卫:组件级中间件完整指南 如何用Viewi构建登录守卫组件级中间件完整指南【免费下载链接】viewiUnique and efficient front-end framework for PHP项目地址: https://gitcode.com/gh_mirrors/vi/viewiViewi 是一款独特的 PHP 前端框架Unique and efficient front-end framework for PHP。它内置的组件级中间件Middleware机制让你只需一个类、一行属性就能为任意页面组件添加登录守卫Login Guard在组件渲染前拦截未登录用户无需手写任何路由判断逻辑。为什么需要登录守卫 传统做法是在每个受保护页面里手动判断用户是否登录代码重复且容易遗漏。Viewi 把守卫做成组件属性✅ 声明式在组件类上一行声明无需侵入页面逻辑✅ 组件级生效守卫只对绑定的组件起作用粒度比全站中间件更细✅ 可组合一个组件可挂多个守卫按顺序执行客户端渲染入口 renderApp.ts 会在组件渲染前先跑完整个守卫链任何一个守卫拒绝next(false)组件就不会被渲染。3步搭建登录守卫第1步安装 Viewigit clone https://gitcode.com/gh_mirrors/vi/viewi第2步编写守卫类守卫只需实现 IMIddleware 接口在run()方法中调用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); // 跳转登录页 $c-next(false); // 拦截 return; } $c-next(true); // 放行 } } 小技巧Viewi 的 BrowserSession 可读写浏览器 sessionStorageClientRoute 负责页面跳转两者可直接注入守卫构造函数。第3步把守卫绑定到组件使用 Middleware 属性 声明式绑定一行搞定use Viewi\Components\Attributes\Middleware; #[Middleware([AuthGuard::class])] class DashboardPage extends BaseComponent { // 未登录时这个页面根本不会渲染 }构建时Builder 会自动解析Middleware属性把守卫清单写入组件元数据并在客户端渲染前按序执行——整个过程零配置。带参数的守卫一份代码多处复用 守卫支持参数化绑定在类名后追加位置参数Viewi 会自动按构造函数参数名注入。class RoleGuard implements IMIddleware { public function __construct(public string $role) {} public function run(IMIddlewareContext $c) { // 只允许 $role 角色访问 $c-next(checkRole($this-role)); } } #[Middleware([[RoleGuard::class, admin]])] class AdminPage extends BaseComponent {} #[Middleware([AuthGuard::class, [RoleGuard::class, editor]])] class EditPage extends BaseComponent {}注意两点写法含义Class::class字符串无参数守卫[Class::class, 参数1, ...]数组带参数守卫参数按构造函数形名注入一个组件可以同时挂多个守卫从左到右依次执行任一项拦截即终止。登录守卫最佳实践清单只拦截、少渲染next(false)后客户端会直接停止渲染配合navigate()跳转登录页体验最佳复用守卫用参数化守卫如 RoleGuard避免为每种权限写一个新类登录页保持无守卫给登录页加AuthGuard会造成跳转死循环⚡守卫内保持轻量守卫在每次组件渲染前执行避免在其中做耗时 IO常见问题排查 ️Q守卫不生效页面还是渲染了检查Middleware属性是否写在组件类上它只支持Attribute::TARGET_CLASS且守卫类已实现IMIddleware接口。Q拦截后页面空白没有跳转确保在next(false)之前调用了$route-navigate(/login)或自行处理重定向。Q多个守卫的执行顺序按#[Middleware([...])]数组中的声明顺序依次执行全部next(true)才会渲染组件见 renderApp.ts 中的守卫链实现。核心源码路径速查文件作用Middleware.php组件级守卫声明属性IMIddleware.php守卫接口定义IMIddlewareContext.phpnext(bool)放行/拦截上下文Builder.php构建期解析守卫清单routes.php路由注册示例可放登录页路由掌握这套机制后登录守卫、角色权限、功能开关等场景都可以用同一个模式优雅解决——这正是 Viewi 高效理念的体现。【免费下载链接】viewiUnique and efficient front-end framework for PHP项目地址: https://gitcode.com/gh_mirrors/vi/viewi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

最新新闻

苹果触控板 Windows 驱动:免费开源方案,从安装到手势调优

苹果触控板 Windows 驱动:免费开源方案,从安装到手势调优

苹果触控板 Windows 驱动:免费开源方案,从安装到手势调优 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precisi…

2026/8/22 16:19:52
C++面试核心知识点与实战技巧全解析

C++面试核心知识点与实战技巧全解析

1. C面试核心知识点梳理 作为一门经久不衰的系统级编程语言,C在游戏开发、高频交易、嵌入式系统等领域始终占据着不可替代的位置。根据我多年面试候选人和被面试的经验,C面试题往往围绕以下几个核心维度展开: 1.1 内存管理机制 C区别于其他…

2026/8/22 16:19:52
金属材料性能指标大全

金属材料性能指标大全

金属材料性能指标大全本文汇总了增材制造结构设计时经常会用到一些材料性能指标,非常实用,有需要的朋友可以收藏一下。低碳钢应力-应变曲线一、弹性指标 1. 正弹性模量定义为理想材料有小形变时应力与相应的应变之比。E以单位面积上承受的力表示&#xf…

2026/8/22 16:19:52
为什么你的C盘越用越满?原来Windows一直在偷偷囤积旧驱动

为什么你的C盘越用越满?原来Windows一直在偷偷囤积旧驱动

为什么你的C盘越用越满?原来Windows一直在偷偷囤积旧驱动 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是不是也发现,明明没装几个大型软件,C盘空…

2026/8/22 16:19:52
Visual Studio 卸载不干净?VisualStudioUninstaller 三步彻底清理残留

Visual Studio 卸载不干净?VisualStudioUninstaller 三步彻底清理残留

Visual Studio 卸载不干净?VisualStudioUninstaller 三步彻底清理残留 【免费下载链接】VisualStudioUninstaller Visual Studio Uninstallation sometimes can be unreliable and often leave out a lot of unwanted artifacts. Visual Studio Uninstaller is desi…

2026/8/22 16:19:52
js 数组对象的map方法

js 数组对象的map方法

map是否会改变原数组? 大家一般都会说,map不会改变原数组,foreach会改变原数组。不过,也是分情况而定的。 如果数组元素是一般数据类型,那确实map不会改变原数组如果数组是一个数组对象呢? 会发现&#xff…

2026/8/22 16:14:52