如何用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),仅供参考