用户资源控制器
app/Http/Controllers/UsersController.php
在上面代码中,由于 show() 方法传参时声明了类型 —— Eloquent 模型 User,对应的变量名 $user 会匹配路由片段中的 {user},这样,Laravel 会自动注入与请求 URI 中传入的 ID 对应的用户模型实例。
路由模型绑定
此功能称为 『隐性路由模型绑定』,是『约定优于配置』设计范式的体现,同时满足以下两种情况,此功能即会自动启用:
- 路由声明时必须使用 Eloquent 模型的单数小写格式来作为路由片段参数,User 对应
{user}
:
Route::get('/users/{user}', 'UsersController@show')->name('users.show');
在使用资源路由 Route::resource('users', 'UsersController'); 时,默认已经包含了上面的声明。
- 控制器方法传参中必须包含对应的 Eloquent 模型类型声明,并且是有序的:
public function show(User $user)
{
return view('users.show', compact('user'));
}
当请求 http://sample.app/users/1 并且满足以上两个条件时,Laravel 将会自动查找 ID 为 1 的用户并赋值到变量 $user 中。
如果数据库中找不到对应的模型实例,会自动生成 HTTP 404 响应。
return view('users.show', compact('user'));
我们将用户对象 $user 通过 compact 方法转化为一个关联数组,并作为第二个参数传递给 view 方法,将数据与视图进行绑定。
show 方法添加完成之后,我们便能在视图中使用 user 变量来访问通过 view 方法传递给视图的用户数据。
我的理解
- 我们想操作数据库的数据,就是操作资源,因为 Laravel 将数据看做一个资源,由 URI 来指定某个资源;
- 既然是用 URL 来请求资源,所以必须创建对应的路由;
- 在创建的路由中,URL 地址带一个参数,此参数的名称,是由想操作的数据对应的模型的名称来定的,要求是此模型名称的单数小写;
- 由于资源类型路由实际上包含了 7 种不同控制器方法的路由,这 7 种路由中,要用到参数的都已经加上,所以资源类型路由默认已经符合上面的要求。
- 在定义路由控制器的方法中,要传参,参数用使用的模型作为类型声明,这个参数来用接收路由 URL 地址中的参数;
以上述代码为例:
- 我们想显示某一用户的信息(密码和空字段不显示):
id: 1,
name: "Aufree",
email: "[email protected]",
created_at: "2016-09-11 08:53:33",
updated_at: "2016-09-11 08:58:01",
- 用户信息对应的数据模型是用户模型 User(相当于 users 数据表 通过 User 这个数据模型来操作数据);
- "Aufree" 这个用户的信息(对应数据库中一条记录)通过一个 URL 进行数据的增、删、查、改;
- 既然用到 URL,就要创建一个路由来处理请求;
- 也就是说,操作数据表中的数据,既用到模型,也用到路由,两者按下面的方式结合起来,就是『隐性路由模型绑定』;
- 响应 URL 请求的路由,比如下面这个:
Route::get('/users/{user}', 'UsersController@show')->name('users.show');
如有必要,路由中的 URL 可带一个参数,用来指定访问哪一个用户的数据记录,参数名用对应的数据模型名称(也就是 User)的单数小写,也就是 user ;
- 因为对用户信息的操作有 7 种之多(见下表),所以使用资源类型路由:
(资源类型的路由参数和普通路由是不一样的,第一个为模型名称,同时也是上面说的 URL 可带的参数,所以路由和模型在这里绑定起来了,第二个为控制器名称,这里控制器不用指定方法,因为 默认包含了 7 种方法)
Route::resource('users', 'UsersController');
这个资源路由相当于下面 7 种普通路由,也默认包含了上述的 URL 地址和参数。
HTTP 请求 | URL | 动作 | 作用 |
---|---|---|---|
GET | /users | UsersController@index | 显示所有用户列表的页面 |
GET | /users/{user} | UsersController@show | 显示用户个人信息的页面 |
GET | /users/create | UsersController@create | 创建用户的页面 |
POST | /users | UsersController@store | 创建用户 |
GET | /users/{user}/edit | UsersController@edit | 编辑用户个人资料的页面 |
PATCH | /users/{user} | UsersController@update | 更新用户 |
DELETE | /users/{user} | UsersController@destroy | 删除用户 |
- 写好路由之后,回到控制器中写出需要用到的方法(7种可选)
在上面用到 7 种方法中的两种 create 和 show 。
- 在控制器方法中,如果要用到 URL 地址中的参数,可使用数据模型(这里是User)作声明,添加一个参数,这样 URL 地址中的参数就会传递过来给方法使用,同时Laravel 会自动注入与 URI 中的参数对应的用户模型实例,也就是说,在方法内的参数已经是实例化的模型——对象。
- view 方法接收两个参数,第一个参数是视图的路径名称,
users.create
是指 resources\views\users\create.blade.php,第二个参数是与视图绑定的数据,我们将用户对象 $user 通过 compact 方法转化为一个关联数组,并作为第二个参数传递给 view 方法,将数据与视图进行绑定。