为何在角色权限中使用Blade指令?请解析给定代码逻辑
解析自定义Blade指令@hasRole的运行逻辑
让我一步步帮你拆解这段代码的逻辑,搞清楚它到底在做什么:
1. AppServiceProvider.php 中的自定义Blade指令
这段代码是在Laravel的服务提供者中注册了一个自定义Blade指令,用来简化模板中的权限判断逻辑:
Blade::directive('hasRole', function ($expression) { $exp=explode(",",$expression); return "<?php if(Auth::user()->hasPermission($exp[0],$exp[1])): ?>"; });
逐行解释:
Blade::directive('hasRole', ...):告诉Laravel我们要新增一个名为@hasRole的Blade指令,后面的回调函数负责处理指令参数并生成对应的原生PHP代码。$exp=explode(",",$expression);:把指令括号里的参数用逗号分割成数组。比如模板里传入的'travel_calendar','view'会被拆成['travel_calendar', 'view'](参数本身带引号,所以数组元素能直接传给hasPermission方法)。- 返回的字符串是原生PHP的
if语句开头:<?php if(Auth::user()->hasPermission($exp[0],$exp[1])): ?>。Blade会自动补全对应的<?php endif; ?>,也就是模板里的@endHasRole。
2. Blade模板中的用法
模板里的这段代码:
@hasRole('travel_calendar','view') <button class="btn btn-space btn-default btn-big tactive" id="travel_menu_cal" > <i class="icon mdi mdi-calendar"></i> Calendar </button> @endHasRole
会被上面的指令转换成原生PHP代码:
<?php if(Auth::user()->hasPermission('travel_calendar','view')): ?> <button class="btn btn-space btn-default btn-big tactive" id="travel_menu_cal" > <i class="icon mdi mdi-calendar"></i> Calendar </button> <?php endif; ?>
简单说就是:只有当前登录用户满足权限条件时,这个Calendar按钮才会被渲染到页面上。
3. 关于'view'的作用
'view'是权限操作类型,和前面的'travel_calendar'(权限主体,对应某个功能模块)配合使用:
travel_calendar:代表权限对应的具体模块(这里是旅行日历功能模块)view:代表对这个模块的具体操作权限——查看权限。通常权限系统里会定义这类标准化操作类型,比如view(查看)、create(创建)、edit(编辑)、delete(删除)等,用来细化用户能对模块执行的操作。
所以这里的逻辑是:只有当用户拥有「旅行日历模块的查看权限」时,才能看到这个Calendar按钮。
内容的提问来源于stack exchange,提问作者rakesh shrestha
相关产品推荐
相关产品推荐

