如何在 Laravel 中将 URL 显示名称而不是 ID?
2024-03-09 13:19:34
URL 显示名称而非 ID
问题背景
在使用像 /collections/1
这样的路由时,我们通常希望 URL 中显示的是名称,而不是 ID。因为名称更具性,有助于用户理解页面内容。然而,由于数据库中通常存储的是 ID,因此需要一种方法将 ID 转换为名称。
解决方案
解决此问题的关键在于使用自定义路由模型绑定,它允许我们在路由中使用模型名称而不是 ID。
步骤 1:创建自定义路由模型绑定
我们创建一个自定义的路由模型绑定类,例如 SousCategorieController
,该类将告诉 Laravel 在解析路由时使用名称而不是 ID。在该类中,我们重写 getRouteKeyName()
方法来指定要使用的字段:
class SousCategorieController extends Controller
{
public function getRouteKeyName()
{
return 'nom';
}
}
步骤 2:注册自定义路由模型绑定
在 app/Providers/RouteServiceProvider.php
中注册自定义路由模型绑定:
public function boot(Router $router)
{
parent::boot($router);
$router->model('collection', 'App\Http\Controllers\SousCategorieController');
}
步骤 3:更改路由
现在,我们可以在路由中使用名称而不是 ID:
Route::get('/collections/{collection}', [SousCategorieController::class, 'show']);
步骤 4:更新控制器方法
在控制器方法中,我们使用模型名称而不是 ID:
public function show(SousCategorie $collection)
{
// 代码略...
}
注意事项
- 确保数据库中的名称字段是唯一的。
- 如果有多个模型使用相同的名称字段,此解决方案可能无法正常工作。
- 考虑使用别名来避免命名冲突,例如:
Route::model('collection', 'App\Models\SousCategorie as Collection');
结论
通过使用自定义路由模型绑定,我们可以轻松地让 URL 显示名称而非 ID。这有助于提高用户体验,使页面更具性和可理解性。
常见问题解答
1. 自定义路由模型绑定在何时有用?
答:当我们希望在路由中使用模型属性而不是 ID 时,自定义路由模型绑定非常有用。
2. 使用自定义路由模型绑定有什么好处?
答:它使 URL 更具描述性,有助于用户理解页面内容。
3. 如何防止名称冲突?
答:确保数据库中的名称字段是唯一的,或者使用别名来避免冲突。
4. 如果我的名称字段不是唯一的怎么办?
答:在这种情况下,自定义路由模型绑定可能无法正常工作,需要使用其他方法,例如在 URL 中使用 ID 和名称的组合。
5. 自定义路由模型绑定与 Eloquent 模型有何关系?
答:自定义路由模型绑定与 Eloquent 模型密切相关,它允许我们在路由中使用 Eloquent 模型属性。