я создал проект с ролями и разрешениями пользователя
Вот мои таблицы и модель
users
- список пользователей приложения - Имя модели [User
],
roles
- список ролей, доступных внутри приложения - Имя модели [Role
],
permissions
- список разрешений, доступных внутри приложения --Модель Имя [Permisions
],
Вот мои таблицы отношений
role_user
, которые содержат отношения между таблицей roles
и users
таблицей
permission_role
Которые содержат отношения между таблицей permissions
и roles
таблицей
permission_user
Которые содержат отношения между таблицей permissions
и users
таблицей
Мои отношенияКод внутри Модель
User.php Модель
/**
* Many-to-Many relations with Role.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function roles()
{
return $this->belongsToMany(Role::class);
}
/**
* Many-to-Many relations with Permission.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
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;
}
public function hasRoles($roles)
{
$roles = is_array($roles) ? $roles : func_get_args();
foreach ($roles as $role)
{
if ($this->hasRole($role))
{
return true;
}
}
return false;
}
/**
* Returns if the given user has an specific role.
*
* @param string $role
*
* @return bool
*/
public function hasRole($role)
{
return $this->roles
->where('name', $role)
->first() != null;
}
Role.php Модель
/**
* Many-to-Many relations with Permissions.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
/**
* Many-to-Many relations with Users.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function users()
{
return $this->belongsToMany(User::class);
}
Permission.php Модель
/**
* Belongs-to-Many relations with Role.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function roles()
{
return $this->belongsToMany(Role::class);
}
/**
* Belongs-to-Many relations with User.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function users()
{
return $this->belongsToMany(User::class);
}
/**
* Belongs-to-Many relations with Modules.
*
* @return \Illuminate\Database\Eloquent\Relations\belongsToMany
*/
А затемнаконец, я создал ServiceProvider
с именем
PermissionServiceProvider
и внутри метода загрузки поставщика услуг я добавил код
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; ?>";
});
}
Все функции и отношения работают нормально, но Запросы выполняются каждый раз, когда я нажимаю кнопку обновления ![Running Queries](https://i.stack.imgur.com/13WQA.png)
Есть ли способ кэшировать все разрешения и ролидля входа в систему пользователя
Отредактировано
Согласно некоторым предложениям, я пробовал пакет кэша laravel
Он не работает для меня