如何阻止Laravel自动移除路由资源参数名称末尾的s字符?
问题原因
Laravel 默认基于英语单复数转换规则处理资源路由的参数命名,会自动将资源名转为单数形式作为路由参数名。你使用的pays是法语名词(单复数同形),不符合英语转换规则,因此被错误切掉末尾的s转为pay参数。
修复方案
方案1:单独指定当前资源路由的参数名
在定义resource路由时链式调用parameters方法,手动指定参数名即可,修改路由代码为:
Route::resource('pays', PaysController::class)->parameters([ 'pays' => 'pays' ]);
修改后生成的路由参数就会变成{pays},可以直接和控制器参数名匹配。
方案2:全局配置单复同形名词规则
如果你有多个这类不符合英语单复数规则的名词,可以全局配置,避免每个资源都单独设置。
在app/Providers/AppServiceProvider.php的boot方法中添加如下代码:
use Illuminate\Support\Pluralizer; public function boot() { Pluralizer::uncountable('pays'); // 其他需要设置的单复同形名词都可以在这里追加,比如Pluralizer::uncountable('xxx'); }
配置后Laravel会将pays识别为单复数同形的名词,所有和pays相关的资源路由都会自动生成{pays}参数,无需额外单独设置。
内容的提问来源于stack exchange,提问作者Nicolas R.
相关产品推荐
相关产品推荐

