Laravel 动态Header设置:未注册用户访问时隐藏个人资料菜单的方法
未登录用户隐藏个人资料菜单实现方案
Laravel 内置了身份验证相关的Blade指令,你直接在公共头部模板header.blade.php中,用指令包裹需要隐藏的个人资料菜单代码即可,不需要修改@include的引入逻辑:
- 推荐写法:使用官方原生
@auth/@guest指令,语法简洁可读性高
{{-- 仅登录用户可见的菜单 --}} @auth <li><a href="/profile">个人资料</a></li> <li><a href="/logout">退出登录</a></li> @endauth {{-- 仅未登录用户可见的菜单 --}} @guest <li><a href="/register">注册账号</a></li> <li><a href="/login">登录</a></li> @endguest
- 等价写法:也可以用Auth门面手动判断登录状态
@if(\Illuminate\Support\Facades\Auth::check()) <li><a href="/profile">个人资料</a></li> @endif
如果你的项目是Laravel 6+版本,也可以用auth()辅助函数替代门面写法:@if(auth()->check())
Blade模板直接查询数据库的优化建议
你当前的写法$array = App\Table::Select(users)->get();虽然可以临时跑出结果,但不符合Laravel的MVC设计规范,存在以下问题:
- 视图层和数据查询逻辑强耦合,后续维护成本高,修改查询逻辑需要遍历所有模板文件
- 相同查询逻辑无法复用,多页面用到同一份数据需要重复编写
- 未做查询优化的情况下极易出现N+1性能问题
注意:你当前的查询代码存在语法错误,select方法的字段参数需要用引号包裹,否则users会被识别为未定义常量直接抛出错误
推荐按照规范调整写法:
- 常规场景下在对应控制器方法中查询数据,再通过视图传参传递给Blade
// 控制器文件顶部引入模型 // Laravel 8+版本模型默认存放于App\Models目录 use App\Models\Table; // 如果是Laravel 7及更早版本,替换为 use App\Table; public function index() { $array = Table::select('users')->get(); // 把变量传递给对应视图 return view('your_view_name', compact('array')); }
- 如果是全站点公共使用的数据(比如头部导航固定内容),可以在服务提供者中做视图共享,不需要每个控制器单独传参:
在app/Providers/AppServiceProvider.php的boot方法中添加以下代码:
use Illuminate\Support\Facades\View; use App\Models\Table; // Laravel 7及更早版本替换为 use App\Table; public function boot() { // 所有Blade模板都可以直接获取$array变量 View::share('array', Table::select('users')->get()); }
内容的提问来源于stack exchange,提问作者umair ur rehman
相关产品推荐
相关产品推荐

