xt-laravel-admin/app/Models/Traits/AdminMenuTrait.php
2018-12-16 11:38:44 +08:00

227 lines
5.7 KiB
PHP

<?php
namespace App\Models\Traits;
use Illuminate\Support\Facades\Config;
trait AdminMenuTrait
{
/**
* 与角色的多对多关系
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function roles()
{
return $this->belongsToMany(Config::get('admin.role'), Config::get('admin.menu_role_table'),
Config::get('admin.menu_foreign_key'), Config::get('admin.role_foreign_key'));
}
/**
* 与权限的多对多关系
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function perms()
{
return $this->belongsToMany(Config::get('admin.permission'), Config::get('admin.permission_menu_table'),
Config::get('admin.menu_foreign_key'), Config::get('admin.permission_foreign_key'));
}
/**
* 把权限转成角色ID,并放到到数组的roleIds
* @param $menu
* @return mixed
*/
private static function transRoleIds($menu) {
if (!empty($menu['roles'])) {
$menu['roleIds'] = array_map(function ($item){
return $item['id'];
}, $menu['roles']);
}
else
{
$menu['roleIds'] = [];
}
return $menu;
}
/**
* 把权限转成权限ID,并放到到数组的permIds
* @param $menu 菜单数组
* @return mixed
*/
private static function transPermIds($menu) {
if (!empty($menu['perms'])) {
$menu['permIds'] = array_map(function ($item){
return $item['id'];
}, $menu['perms']);
}
else
{
$menu['permIds'] = [];
}
return $menu;
}
/**
* 查找菜单
* @param $id 菜单ID
* @return mixed
*/
public static function find($id)
{
return static::with('roles')->find($id);
}
/**
* 查找带权限的菜单
* @param $id 菜单ID
* @return array|mixed
*/
public static function findByRoleId($id)
{
$menu = [];
$menuObj= static::with('roles')->find($id);
if (!empty($menuObj))
{
$menu = $menuObj->toArray();
$menu = static::transRoleIds($menu);
}
return $menu;
}
/**
* 转成树结构
* @param array $elements 树数组
* @param int $parentId 上级ID
* @param array $roleIds 权限ID
* @return array
*/
public static function toTree(array $elements = [], $parentId = 0, $roleIds = [])
{
$branch = [];
if (empty($elements)) {
$elements = static::with('roles', 'perms')->orderByRaw('`order` = 0,`order`')->get()->toArray();
}
foreach ($elements as $element) {
if ($element['parent_id'] == $parentId) {
$element = static::transRoleIds($element);
$element = static::transPermIds($element);
if (!empty($element['roleIds']) && !empty($roleIds))
{
$_roles = array_intersect($element['roleIds'], $roleIds);
if (empty($_roles)) continue;
}
$children = static::toTree($elements, $element['id'], $roleIds);
if ($children) {
$element['children'] = $children;
}
$branch[] = $element;
}
}
return $branch;
}
/**
* 设计分支排序
*
* @param array $order
*
* @return void
*/
protected static function setBranchOrder(array $order)
{
static::$branchOrder = array_flip(array_flatten($order));
static::$branchOrder = array_map(function ($item) {
return ++$item;
}, static::$branchOrder);
}
/**
* 保存树类菜单
* @param array $tree 树结构
* @param int $parentId 上级ID
*/
public static function saveTree($tree = [], $parentId = 0)
{
if (empty(static::$branchOrder)) {
static::setBranchOrder($tree);
}
foreach ($tree as $branch) {
$node = static::find($branch['id']);
$node->parent_id = $parentId;
$node->order = static::$branchOrder[$branch['id']];
$node->save();
if (isset($branch['children'])) {
static::saveTree($branch['children'], $branch['id']);
}
}
}
/**
* 保存角色
* @param $roles
*/
public function saveRoles($roles)
{
if (!empty($roles)) {
$this->roles()->sync($roles);
} else {
$this->roles()->detach();
}
}
/**
* 删除菜单
* @param array $options
* @return mixed
*/
public function delete(array $options = [])
{
$children = $this->where('parent_id', $this->id)->get();
$this->where('parent_id', $this->id)->delete();
if ($children) {
foreach ($children as $child) {
$child->roles()->detach();
$child->perms()->detach();
}
}
$this->roles()->detach();
$this->perms()->detach();
return parent::delete($options);
}
/**
* 得到用户菜单
* @param $user
* @return array
*/
public static function getUserMenu($user) {
$isAdminHasAllRoles = true;
$isAdmin = $user->hasRole('admin');
$roles = $user->cachedRoles();
$roleIds = [0];
foreach ($roles as $role)
{
$roleIds[] = $role->id;
}
if ($isAdminHasAllRoles && $isAdmin) $roleIds = [];
$menus = static::toTree([], 0, $roleIds);
return $menus;
}
}