📅  最后修改于: 2023-12-03 14:43:49.841000             🧑  作者: Mango
在 Laravel 中,我们可以使用资源路由(Resource Route)来简化控制器(Controller)和路由(Route)的定义。资源路由内置了许多常用的 HTTP 请求和处理器(handler),开发者只需要定义一个资源路由就可以处理所有请求,大大减少了代码冗余和开发时间。
在 web.php
或 api.php
中,我们可以使用 Route::resource
方法来定义资源路由。例如:
Route::resource('users', 'UserController');
资源路由会自动生成以下路由:
| HTTP 请求 | URL 地址 | 控制器方法(method) | 路由名称(name) |
|---------|--------|---------------------|----------------|
| GET | /users
| index | users.index |
| GET | /users/create
| create | users.create |
| POST | /users
| store | users.store |
| GET | /users/{user}
| show | users.show |
| GET | /users/{user}/edit
| edit | users.edit |
| PUT/PATCH | /users/{user}
| update | users.update |
| DELETE | /users/{user}
| destroy | users.destroy |
如果你只需要定义部分资源路由,可以使用 only
或 except
方法。例如:
Route::resource('users', 'UserController')->only(['index', 'show']);
定义资源路由后,我们需要在控制器中编写相应的方法来处理请求。控制器方法的命名规则如下:
| 方法名 | HTTP 请求 | URL 地址 | 作用 |
|--------|---------|--------|------|
| index | GET | /users
| 显示所有用户列表 |
| create | GET | /users/create
| 显示添加用户表单 |
| store | POST | /users
| 保存新添加的用户 |
| show | GET | /users/{user}
| 显示指定用户详情 |
| edit | GET | /users/{user}/edit
| 显示编辑用户表单 |
| update | PUT/PATCH | /users/{user}
| 更新指定用户信息 |
| destroy | DELETE | /users/{user}
| 删除指定用户 |
除了以上七个默认方法,我们还可以定义其他自定义方法。例如:
class UserController extends Controller
{
// ...
public function customMethod()
{
// 处理自定义请求
}
}
在定义路由时,我们需要使用 Route::resource
的 except
或 only
方法来排除或包含自定义方法。例如:
Route::resource('users', 'UserController')->except('create', 'store', 'edit', 'update', 'destroy');
Route::get('users/custom', 'UserController@customMethod');
资源路由中,我们可以使用 URL 参数来标识特定的资源,例如 /users/1
表示 ID 为 1 的用户。在控制器方法中,我们需要对参数进行绑定(bind)。
Laravel 提供了两种参数绑定方式:隐式绑定和显式绑定。
隐式绑定是通过类型提示(type hinting)来自动绑定模型实例。例如:
class UserController extends Controller
{
public function show(User $user)
{
// 显示 $user 用户信息
}
}
上述代码中,路由参数 user
会自动绑定到对应 id
的 User
模型实例。这相当于执行了以下代码:
$user = User::findOrFail($id);
如果绑定失败,Laravel 会自动返回 HTTP 404 错误。
显式绑定是通过在路由服务提供者中注册(bind)绑定关系来手动绑定模型和路由参数之间的关系。例如:
class RouteServiceProvider extends ServiceProvider
{
public function boot()
{
parent::boot();
Route::model('user', User::class);
}
}
上述代码中,我们注册了 User
模型和路由参数 user
之间的绑定关系。这样,在控制器方法中,我们就可以使用 $user
参数来自动获取请求的用户信息。
class UserController extends Controller
{
public function show(User $user)
{
// 显示 $user 用户信息
}
}
除了模型绑定,我们还可以在路由服务提供者中定义自定义参数绑定逻辑。例如:
class RouteServiceProvider extends ServiceProvider
{
public function boot()
{
parent::boot();
Route::bind('user', function ($value) {
return User::where('name', $value)->firstOrFail();
});
}
}
上述代码中,我们定义了一个自定义的 user
参数绑定逻辑。该逻辑会从数据库中查找 name
字段等于 $value
的用户信息,如果找到了,就返回该用户模型实例。如果找不到,就自动抛出 HTTP 404 错误。
Laravel 资源路由极大地简化了路由和控制器的定义,使我们的代码更加简洁、优雅。同时,参数绑定的功能也让我们能够更加方便地处理 URL 参数,提高了开发效率。