laravel - 通过 eloquent 具有子项和权限的 Laravel 菜单
问题描述
您好,我正在尝试获取菜单及其子项以及分配给角色的权限。我怎样才能通过雄辩的关系来实现这一点。表是角色、菜单、角色菜单。用户只会看到他有权访问的那些菜单。
这是我的代码:
这是我的控制器方式
$menuList = Menu::tree()->with('roleMenus')->where('per_select','=',0);
这是模型
class Menu extends Model
{
use HasFactory;
protected $table = "menus";
protected $fillable = ['title', 'url', 'parent_id', 'sort_order'];
public function parent()
{
return $this->hasOne('App\Models\Menu', 'id', 'parent_id')->orderBy('sort_order');
}
public function children()
{
return $this->hasMany('App\Models\Menu', 'parent_id', 'id')->orderBy('sort_order');
}
public static function tree()
{
return static::with(implode('.', array_fill(0, 100, 'children')))->where('parent_id', '=', '0')->orderBy('sort_order', 'asc')->get();
}
public function roleMenus()
{
return $this->belongsToMany(Role::class);
}
}
解决方案
我通常处理角色和权限的方式是使用Spatie Laravel Permissions包。
我所做的是创建一个 menu.blade.php 文件,其中定义了所有路由。但每条路线仅根据用户权限呈现。您可以使用“can”方法来实现这一点。例如:
@if($user->can('articles'))
<a href="{{ route('articles) }}">Articles</a>
@endif
@if($user->can('settings'))
<a href="{{ route('settings) }}">Settings</a>
@endif
您可以使用 Auth::guard($yourGuardName)->user() 更改 $user 以获取当前经过身份验证的用户。
推荐阅读
- c# - 如何使 WebBrowser 控件在 C# 中包装另一个浏览器
- apollo - 在查询中找到 @client 指令,但未指定 ApolloClient 解析器
- android - GCP api 在 Playstore 控制台上暴露了关键警告
- css - 样式表中的语法问题
- javascript - Date.parse 无法检查字符串是否为日期
- node.js - NodeJS 部署到 A2Hosting 子域?
- ruby-on-rails - 通过 :test 导致 ArgumentError: 参数数量错误(给定 0,预期 2..3)
- php - 如何限制递归?- Laravel/刀片
- outlook - Outlook Web 插件无法在桌面客户端上运行
- java - 活动中的浮动图像 - android -