我在laravel中使用自己的用户角色和权限实现,如何在用户登录时缓存所有权限和角色,并在添加新记录时刷新缓存。我的表是users、roles、permissions、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-zahid https://stackoverflow.com/a/53511803/8487424的方法,它可以很好地缓存permissions表中的所有permisisons,但是有没有办法保存所有的权限,以及指定用户和当前登录用户的角色的权限
发布于 2018-11-28 10:48:49
您可以使用Laravel模型缓存,如以下链接所示:
https://laravel-news.com/laravel-model-caching
我将创建一个方法来获取和缓存当前用户的角色和权限。
你可以在这里阅读更多关于缓存的内容:
https://laravel.com/docs/5.7/cache
我希望这能帮到你
更新
试试这样的东西
if (Schema::hasTable('permissions') ) {
$userId = Auth::user()->id
return Cache::remember($this->cacheKey() . $userId . ':permissions', 60, function() use ($userId) {
return Permission::where('user_id', $userId)->get();
}
}然后,您只需要更新您的hasPermission()方法来检查缓存。
我也尽量避免使用map(),因为php比sql花费的时间要长得多。
发布于 2018-11-28 11:45:27
您可以将缓存存储在服务提供商中。我只是分享我的方法
$permissions = Cache::rememberForever('permissions', function () {
return Permission::get();
});这将永远记住密钥名称为permissions的权限,直到您更改它为止
你也可以用特定的时间记住这一点。
$permissions = Cache::remember('permissions', 3600, function () {
return Permission::get();
});我将其放在应用程序服务提供商中,以便每次应用程序加载时检查是否在缓存中找到permissions,然后不运行查询,如果未找到,则从数据库中获取它
因此,在缓存部分之后,您的脚本可能如下所示:
$permissions->map(function ($permission)
{
Gate::define($permission->name, function ($user) use ($permission)
{
return $user->hasPermission($permission);
});
});在Laravel Documentation上查找更多信息
发布于 2019-07-25 12:50:12
最后我找到了解决方案。Artisan缓存清除命令不能正常工作。尝试删除此文件夹上的缓存。存储/框架/缓存/数据
这肯定能行得通。祝好运
https://stackoverflow.com/questions/53510571
复制相似问题