159 lines
4.4 KiB
PHP
159 lines
4.4 KiB
PHP
<?php
|
|
|
|
namespace App\Models\Traits;
|
|
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Facades\Config;
|
|
|
|
trait AdminUsersTrait
|
|
{
|
|
public function cachedRoles()
|
|
{
|
|
$userPrimaryKey = $this->primaryKey;
|
|
$cacheKey = 'admin_roles_for_user_'.$this->$userPrimaryKey;
|
|
return Cache::tags(Config::get('admin.role_user_table'))->remember($cacheKey, Config::get('admin.cache.ttl'), function () {
|
|
return $this->roles()->get();
|
|
});
|
|
}
|
|
public function save(array $options = [])
|
|
{ //both inserts and updates
|
|
$result = parent::save($options);
|
|
Cache::tags(Config::get('admin.role_user_table'))->flush();
|
|
return $result;
|
|
}
|
|
public function delete(array $options = [])
|
|
{ //soft or hard
|
|
$result = parent::delete($options);
|
|
Cache::tags(Config::get('admin.role_user_table'))->flush();
|
|
return $result;
|
|
}
|
|
public function restore()
|
|
{ //soft delete undo's
|
|
$result = parent::restore();
|
|
Cache::tags(Config::get('admin.role_user_table'))->flush();
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* 与角色的多对多关系
|
|
*
|
|
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
|
|
*/
|
|
public function roles()
|
|
{
|
|
return $this->belongsToMany(Config::get('admin.role'), Config::get('admin.role_user_table'),
|
|
Config::get('admin.user_foreign_key'), Config::get('admin.role_foreign_key'));
|
|
}
|
|
|
|
/**
|
|
* 当删除的时候,把用户关系也删除
|
|
*
|
|
* @return void|bool
|
|
*/
|
|
public static function boot()
|
|
{
|
|
parent::boot();
|
|
|
|
static::deleting(function($user) {
|
|
if (!method_exists(Config::get('auth.providers.users.model'), 'bootSoftDeletes')) {
|
|
$user->roles()->sync([]);
|
|
}
|
|
|
|
return true;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 检查用户是是否有角色.
|
|
*
|
|
* @param string|array $name 角色名.
|
|
* @param bool $requireAll 是否有全部请求权限
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function hasRole($name, $requireAll = false)
|
|
{
|
|
if (is_array($name)) {
|
|
foreach ($name as $roleName) {
|
|
$hasRole = $this->hasRole($roleName);
|
|
|
|
if ($hasRole && !$requireAll) {
|
|
return true;
|
|
} elseif (!$hasRole && $requireAll) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// If we've made it this far and $requireAll is FALSE, then NONE of the roles were found
|
|
// If we've made it this far and $requireAll is TRUE, then ALL of the roles were found.
|
|
// Return the value of $requireAll;
|
|
return $requireAll;
|
|
} else {
|
|
foreach ($this->cachedRoles() as $role) {
|
|
if ($role->name == $name) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* 检查用户是否有权限
|
|
*
|
|
* @param string|array $permission 权限名
|
|
* @param bool $requireAll 是否有全部请求权限
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function can($permission, $requireAll = false)
|
|
{
|
|
if (is_array($permission)) {
|
|
|
|
foreach ($permission as $permName) {
|
|
$hasPerm = $this->can($permName);
|
|
|
|
if ($hasPerm && !$requireAll) {
|
|
return true;
|
|
} elseif (!$hasPerm && $requireAll) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// If we've made it this far and $requireAll is FALSE, then NONE of the perms were found
|
|
// If we've made it this far and $requireAll is TRUE, then ALL of the perms were found.
|
|
// Return the value of $requireAll;
|
|
return $requireAll;
|
|
} else {
|
|
|
|
foreach ($this->cachedRoles() as $role) {
|
|
// Validate against the Permission table
|
|
foreach ($role->cachedPermissions() as $perm) {
|
|
|
|
|
|
if (str_is( $permission, $perm->name) ) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* 保存角色
|
|
*
|
|
* @param mixed $roles
|
|
*/
|
|
public function saveRoles($roles)
|
|
{
|
|
if (!empty($roles)) {
|
|
$this->roles()->sync($roles);
|
|
} else {
|
|
$this->roles()->detach();
|
|
}
|
|
}
|
|
|
|
} |