我正在使用Laratrust向我的User
模型添加角色。我也想添加另一个表来使用角色。我在配置中添加了modelAs
,但 Laratrust 混淆了这两种类型。使用 id[3] 查询modelA
时,我从带有 id[3] 的user
中获取角色。我在配置中更改的只是user_models数组,如下所示:
'user_models' => [
'users' => 'AppUser',
'modelAs' => 'AppModelA'
],
然后,我在role_users
中添加了 modelA,并将user_type
设置为AppModelA
|user_id |role_id |user_type |
|-----------|-----------|-----------------|
|3 |6 |AppUser |
|3 |7 |AppUser |
|3 |8 |AppModelA |
当我使用语句$modelA->roles
时,多态关系不应该知道我没有使用User
模型吗?
我相信问题与缓存角色有关,因为用于在redis
中缓存角色的键是laratrust_roles_for_user_3
的,这对于user_type
的两种变体都是相同的。所以缓存的值被覆盖了吗?我应该如何解决这个问题?
任何帮助将不胜感激。
我更深入地了解了包如何在缓存中存储值。 在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 的模型,密钥将是相同的。这就是混乱的原因。 一个快速测试表明,如果我在 laratrust 配置中设置'use_morph_map' => true
并更改user_type
列以匹配user_models
的key
,那么有两个缓存条目对应于我的两个模型。现在->hasRole
返回正确的结果!
注意:我必须在测试前清除缓存,因为它会显示错误的存储值。