最近在开发API这块,使用sanctum里的createToken方法返回Token的时候报错:
"message": "No morph map defined for model [AppModelsUser].",
"exception": "IlluminateDatabaseClassMorphViolationException",
找了2天原因,搜索引擎里找了半天,硬是没有人和我遇到同样的情况,也不知道问题出在了什么地方,最后重新安装一次Laravel,在使用“自定义多态型”时,测试报出上面的错误。终于真想大白了。
在APP服务提供商(AppServiceProvider)里,我在boot方法里使用了下面的代码:
public function boot()
{
$this->bootEloquentMorphs(); //映射模型(修改映射名)
}
private function bootEloquentMorphs()
{
IlluminateDatabaseEloquentRelationsRelation::enforceMorphMap([
'article' => 'AppModelsarticleArticle', //文章模型
'recipe' => 'AppModelsrecipeRecipe', //菜谱模型
]);
}
其作用是在Tags_maps 多对多多态情况下,查询 文章/菜谱时,taggable_type 使用 “article”或者"recipe"来区别,而不是使用"AppModelsarticleArticle"这样的模型路径。
上面使用的是 :enforceMorphMap 方法来映射(官方手册用例),查看源代码:
public static function enforceMorphMap(array $map, $merge = true)
{
static::requireMorphMap();//设置为:避免在没有模型映射的情况下使用多态关系。
return static::morphMap($map, $merge);
}
问题出在了 static::requireMorphMap(); 方法上,发现注释这行即可正常使用,但我们不可以直接修改框架里的源代码,所以我们可以看下一行代码:static::morphMap($map, $merge);这是真正起作用的,我们将 requireMorphMap()方法排除的方案是直接使用 morphMap()方法即可:
//映射模型(修改映射名)
private function bootEloquentMorphs()
{
IlluminateDatabaseEloquentRelationsRelation::morphMap([
'article' => 'AppModelsarticleArticle', //文章模型
'recipe' => 'AppModelsrecipeRecipe', //菜谱模型
]);
}
现在测试OK~
上面requireMorphMap方法对检测如果使用了多对多多态而没有在Provider里注册,就会报错,所以我们只需要增加user的映射即可:
//映射模型(修改映射名)
private function bootEloquentMorphs()
{
//使用 enforceMorphMap 方法sanctum会报错:No morph map defined for model [AppModelsUser].
IlluminateDatabaseEloquentRelationsRelation::enforceMorphMap([
'article' => AppModelsarticleArticle::class, //文章模型
'recipe' => AppModelsrecipeRecipe::class, //菜谱模型
'user' => AppModelsUser::class, //用户(personal_access_tokens表使用)
]);
}
推荐使用方法2,毕竟官方案例使用 enforceMorphMap了严格检测没有使用映射,这样也可以避免我们使用多态时没有关联模型而产生耦合情况。
除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:https://www.55mx.com/post/229
《【Laravel经验】使用多对比关联多态映射的enforceMorphMap时遇到问题》的网友评论(0)