【发布时间】:2019-07-25 12:50:11
【问题描述】:
我在 laravel 中使用自己的用户角色和权限实现,如何缓存用户登录时的所有权限和角色,以及在添加新记录时刷新缓存。 我的表是用户、角色、权限、permission_role、permission_user、role_user。这是我的表结构
我已经创建了提供程序并将此代码添加到启动方法
Permission::get()->map(function ($permission)
{
Gate::define($permission->name, function ($user) use ($permission)
{
return $user->hasPermission($permission);
});
});
它工作正常,但每次都在运行查询,这会减慢我的应用程序速度有没有办法缓存所有权限
这是我的 PermissionServiceProvider 类
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Blade;
use App\Models\Permission;
class PermissionServiceProvider extends ServiceProvider
{
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
if (Schema::hasTable('permissions'))
{
Permission::get()->map(function ($permission)
{
Gate::define($permission->name, function ($user) use ($permission)
{
return $user->hasPermission($permission);
});
});
}
Blade::directive('role', function ($role)
{
return "<?php if(Auth::user()->hasRole({$role})): ?>";
});
Blade::directive('endrole', function ($role)
{
return "<?php endif; ?>";
});
}
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
}
最后进入用户模型
public function hasPermission($permission)
{
return $this->hasPermissionThroughRole($permission) || (bool) $this->permissions->where('name',$permission->name)->count();
}
public function hasPermissionThroughRole($permission)
{
foreach($permission->roles as $role)
{
if($this->roles->contains($role))
{
return true;
}
}
return false;
}
这也是我的比特桶回购
https://manojkiran@bitbucket.org/manojkiran/userrolesandpermissions.git
我已经尝试过@emtiaz-zahidhttps://stackoverflow.com/a/53511803/8487424 的方法,它可以很好地缓存permissions 表中的所有permisisons,但是有什么方法可以缓存所有权限以及特定用户和角色的权限当前登录的用户
【问题讨论】:
-
如何缓存用户登录时的所有权限和角色,并在添加新记录时刷新缓存。 有几种方法:1)只是在会话中缓存它或 cookie,2) 使用 laravel cache 功能对其进行缓存,并在更新完成时清除缓存
-
如果可用,请先用一些代码详细说明您的问题。
-
这是我的完整代码Click here
标签: laravel