Laravel caching База данных запросов - PullRequest
0 голосов
/ 11 декабря 2018

я создал проект с ролями и разрешениями пользователя

Вот мои таблицы и модель

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

Есть ли способ кэшировать все разрешения и ролидля входа в систему пользователя

Отредактировано

Согласно некоторым предложениям, я пробовал пакет кэша laravel

Он не работает для меня

1 Ответ

0 голосов
/ 11 декабря 2018

Вы ищете для кэширования pakage модели laravel https://github.com/GeneaLabs/laravel-model-caching.

Рекомендую установить пакет с Redis.Также это очень полезно при работе с очередями.

Работает как положено.Скриншоты из моего проекта.

До:

enter image description here

После:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...