📜  laravel 资源路由 (1)

📅  最后修改于: 2023-12-03 14:43:49.841000             🧑  作者: Mango

Laravel 资源路由介绍

在 Laravel 中,我们可以使用资源路由(Resource Route)来简化控制器(Controller)和路由(Route)的定义。资源路由内置了许多常用的 HTTP 请求和处理器(handler),开发者只需要定义一个资源路由就可以处理所有请求,大大减少了代码冗余和开发时间。

定义资源路由

web.phpapi.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 |

如果你只需要定义部分资源路由,可以使用 onlyexcept 方法。例如:

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::resourceexceptonly 方法来排除或包含自定义方法。例如:

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 会自动绑定到对应 idUser 模型实例。这相当于执行了以下代码:

$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 参数,提高了开发效率。