Laravel:资源控制器将参数从 ID 更改为 Slug

MrS*_*ngh 6 parameters resources controller laravel

在我的 Laravel 应用程序中,我使用了普通路由,例如 GET、POST、PUT 以及所有带有各种控制器的路由。但是随着应用程序的进行,routes/api.php文件变得非常庞大。因此,我正在使用“资源控制器”语法对其进行更改,以实现更简洁和精简的代码。

但是,早些时候我能够使用 url 中的“token”或“slug”参数来获取数据,例如:show/{token} & show($token)show/{slug} & show($slug ),但现在每当我尝试这些或任何其他参数时,我都会404 not found出错。因此,我只使用默认的“id”参数。

之前:

Route::get('/categories', 'CategoryController@index');
Route::get('/categories/{token}', 'CategoryController@show');
Run Code Online (Sandbox Code Playgroud)

现在:

Route::resource('/categories', 'CategoryController');
Run Code Online (Sandbox Code Playgroud)

有什么方法可以将默认的“id”参数更改为任何其他..?

upe*_*996 14

这也可以通过更改自定义密钥来实现。这里slug指的是Category模型中的一列。

Route::resource('categories', 'CategoryController')->parameters([
    'categories' => 'category:slug',
]);
Run Code Online (Sandbox Code Playgroud)

请注意

在上面的调用中parameters,键categories应该与资源路由中使用的名称匹配:Route::resource('categories',...

'category:slug'应该与控制器方法签名中使用的名称相匹配,例如:public function edit(Category $category),与您希望在模型上使用的键的名称相结合Category

  • 这有效,只需一点解释。对于隐式模型绑定,大多数情况下参数应与模型名称(单数)相同。在上面的示例中,它将是 `->parameters([ 'categories' => 'category:slug', ])` 也就是说,如果您想使用 `slug` 而不是 `id` 来绑定模型,其中 `{ category:slug}` 将替换 URI 段 `{category}`。你总是运行 `php artisan route:list` 来检查 URI 段 (3认同)

lag*_*box 12

对于资源路由,路由参数是资源名称,第一个参数,单数形式。

Route::resource('categories', 'CategoryController');
Run Code Online (Sandbox Code Playgroud)

会给你一个路由参数category。您可以通过运行php artisan route:list并查看定义的路由来看到这一点。

如果要为资源使用不同的参数名称,也可以通过覆盖参数来实现:

Route::resource('categories', 'CategoryController')->parameters([
    'categories' => 'something',
]);
Run Code Online (Sandbox Code Playgroud)

现在使用的路由参数将是something.

这仅与路由参数名称有关,与如何解析任何绑定无关,除非您有专门为参数名称定义的显式路由模型绑定。

如果您使用隐式路由模型绑定,您将在模型本身上定义通过该getRouteKeyName方法进行绑定的字段。[在 Laravel 的下一版本中,您将能够定义路由定义本身中使用的字段。]

Laravel 6.x 文档 - 控制器 - 资源控制器 - 命名资源参数

Laravel 6.x 文档 - 路由 - 模型绑定 - 隐式路由模型绑定 getRouteKeyName