checkout($request, $permission); return $next($request); } protected function checkout(Request $request, string $permission) { $permissionName = PermissionName::tryFrom($permission); $permissions = []; $subPermissionRelations = $permissionName ? $permissionName?->subPermissionRelations() : []; if ($subPermissionRelations) { $subPermissionKeys = $this->subPermissionKeys($request, $permissionName); throw_validation_if(!$subPermissionKeys, "Sub-permission parameter exception"); foreach ($subPermissionKeys as $key) { $subPermission = $subPermissionRelations[$key] ?? null; throw_validation_if(! $subPermission, "Sub-permission parameter exception"); $permissions[] = $subPermission; } } else { $permissions[] = $permission; } foreach ($permissions as $permission) { if (! Auth::user()->hasPermissionTo($permission)) { throw UnauthorizedException::forPermissions([$permission]); } } } protected function subPermissionKeys(Request $request, PermissionName $permissionName) { $keys = []; switch ($permissionName) { case PermissionName::CONFIG_INDEX: $keys = $request->get("group", []); break; case PermissionName::CONFIG_SETTING: $keys = array_column($request->all(), 'group'); break; } return array_unique($keys); } }