0

我正在使用Laratrust为我的User模型添加角色。我也想添加另一个表来使用角色。我添加modelAs到配置中,但 Laratrust 混淆了这两种类型。user使用 id[3] 查询时,我使用 id[3] 获取角色modelA。我在配置中更改的只是 user_models 数组,如下所示:

'user_models' => [
    'users' => 'App\User',
    'modelAs' => 'App\ModelA'
],

然后我添加了modelArole_users并设置user_typeApp\ModelA

|user_id    |role_id    |user_type        |
|-----------|-----------|-----------------|
|3          |6          |App\User         |
|3          |7          |App\User         |
|3          |8          |App\ModelA       |

User当我使用语句时,多态关系不应该知道我没有使用模型$modelA->roles吗?

我认为问题与缓存角色有关,因为用于缓存角色的redis密钥laratrust_roles_for_user_3对于user_type. 那么缓存的值被覆盖了吗?我应该如何解决这个问题?

任何帮助,将不胜感激。

4

1 回答 1

0

我深入研究了包如何在缓存中存储值。在LaratrustUserDefaultChecker缓存键中建立使用$cacheKey = 'laratrust_roles_for_'.$this->userModelCacheKey() .'_'. $this->user->getKey();userModelCacheKey()功能如下:

public function userModelCacheKey()
{
    if (!Config::get('laratrust.use_morph_map')) {
        return 'user';    // <-- this caused the confusion.
    }

    foreach (Config::get('laratrust.user_models') as $key => $model) {
        if ($this->user instanceof $model) {
            return $key;
        }
    }
}

目前我没有使用该morph_map设置,因此对于具有相同 ID 的模型,密钥将是相同的。这就是混乱的原因。快速测试表明,如果我'use_morph_map' => true在 laratrust 配置中设置并更改user_type列以匹配keyuser_models那么有两个缓存条目对应于我的两个模型。现在->hasRole返回正确的结果!

注意:我必须在测试前清除缓存,因为它会显示错误的存储值。

于 2020-10-06T09:18:08.820 回答