Laravel 8 资源路由前缀修改后Slug路由模型绑定异常问题求助
问题成因
Laravel 资源路由会自动根据传入的资源名称生成对应路由参数:你最初定义Route::resource('/posts', ...)时,生成的详情路由参数为{post},和控制器show方法里的$post参数名完全匹配,因此隐式模型绑定会自动根据路由传递的slug值查询对应的Post模型,功能正常。
当你把资源名称修改为news后,Laravel自动生成的详情路由参数变为{news},和控制器方法里的$post参数名不匹配,隐式模型绑定不会触发,此时Laravel只会注入一个未加载业务数据的空Post模型实例,因此你只能看到Post模型的结构,无法获取对应slug的文章数据。
解决方案
任选以下任意一种方案修复即可:
方案1:修改控制器参数名
将PostController的show方法参数名调整为和路由参数一致的$news:
public function show(Post $news) { dd($news); }
方案2:手动指定资源路由参数名(更推荐,语义一致性更强)
在定义路由时手动指定参数保持为post,无需修改控制器原有代码:
Route::resource('/news', App\Http\Controllers\PostController::class) ->only(['index','show']) ->parameters(['news' => 'post']);
修改后详情路由会保持为/news/{post},和原有控制器参数匹配,隐式模型绑定即可恢复正常。
内容的提问来源于stack exchange,提问作者Maik Lowrey
相关产品推荐
相关产品推荐

