我正在使用Laratrust向我的User模型添加角色。我还想添加另一个表来使用角色。我将modelAs添加到配置中,但是Laratrust混淆了这两种类型。在使用id3查询modelA时,我使用id3从id3获取角色。我在配置中只更改了user_models数组,如下所示:
'user_models' => [
'users' => 'App\User',
'modelAs' => 'App\ModelA'
],然后我在role_users中添加了modelA,并将user_type设置为App\ModelA
|user_id |role_id |user_type |
|-----------|-----------|-----------------|
|3 |6 |App\User |
|3 |7 |App\User |
|3 |8 |App\ModelA |当我使用语句$modelA->roles时,多态关系不应该知道我没有使用User模型
我认为问题与缓存角色有关,因为在redis中用于缓存角色的键是laratrust_roles_for_user_3,这对于user_type的两种变体都是相同的。所以缓存值会被覆盖吗?我该怎么解决这个问题呢?
任何帮助都将不胜感激。
发布于 2020-10-06 17:18:09
我深入研究了包是如何在缓存中存储值的。在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返回了正确的结果!
注意:我必须在测试前清除缓存,因为它会显示错误的存储值。
https://stackoverflow.com/questions/64119688
复制相似问题