返回

如何在 Laravel 中将 URL 显示名称而不是 ID?

php

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 模型属性。