75142913在线留言
【Laravel经验】使用多对比关联多态映射的enforceMorphMap时遇到问题_PHP技术_网络人

【Laravel经验】使用多对比关联多态映射的enforceMorphMap时遇到问题

Kwok 发表于:2022-06-07 18:07:44 点击:91 评论: 0

最近在开发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"这样的模型路径。

二、解决方案

1.使用morphMap方法

上面使用的是 :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~

2、增加user模型的映射

上面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
标签:经验laravelKwok最后编辑于:2022-06-07 19:07:21
0
感谢打赏!

《【Laravel经验】使用多对比关联多态映射的enforceMorphMap时遇到问题》的网友评论(0)

本站推荐阅读

热门点击文章