Как проверить тот же набор разрешений, назначенных другой роли? - PullRequest
0 голосов
/ 13 января 2020

Я использую spatie permission package в Laravel и хочу убедиться, что две роли с разными именами не должны иметь одинаковые разрешения при создании роли, например

Role A
 - Pemission 1
 - Permission 2
 - Permission 3

Role B
 - Pemission 1
 - Permission 2
 - Permission 3

Если это происходит, система не должна создать 2-ю роль "Роль B"

Может кто-нибудь, пожалуйста, наставить меня?

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Найденное решение спасибо за помощь

 $roles = Role::get();
        $permissions = $request->input('permissions');
        $notSame = false;
        $sameRole = null;
        for ($i = 0; $i < count($roles); $i++) {
            $role_permissions[$i] = $roles[$i]->getAllPermissions()
                ->pluck('id')->toArray();
            for ($j = 0; $j < count($role_permissions[$i]); $j++) {
                if ($role_permissions[$i] == $permissions) {
                    $notSame = true;
                    $sameRole = $roles[$i];
                    break;
                }
            }
        }
        /**
         * Below condition will check if same set of permissions is
         * not assigned to any other role then It will be processed
         * further otherwise user have to choose different set of
         * permission
         *
         */
        if ($notSame && ($sameRole != null)) {
            alert()->warning('Role Already Exists', 'A role named as "' . $sameRole->name . '" with same permissions 
             already exists try with another permissions set');
         return redirect()->back();

        } else {

    - Write here your code to store into DB
    }
0 голосов
/ 14 января 2020
  1. Убедитесь, что вы опубликовали файл конфигурации (config/permissions.php) пакета. Если нет, запустите

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"

Расширение модели Spatie\Permission\Models\Role. Измените файл конфигурации так, чтобы он указывал на расширенную ролевую модель вместо стандартной. Переопределите метод stati c boot внутри расширенную модель и добавьте этот обратный вызов:
self::creatig(function($model) {
    $permissions = $model->permissions;
    $existingRoles = Role::whereHas('permissions', function($query) using $permissions {
        $query->whereIn('id', $permissions->pluck('id'));
    })->get();
    if (!$existingPosts->isEmpty()) throw Exception('There is already a role with these permissions');
});
Вы можете перехватить это исключение позже в контроллере и вернуть сообщение об ошибке в качестве ответа, если вы хотите, чтобы пользователь знал, что произошло.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...