用户资源控制器

用户资源控制器

app/Http/Controllers/UsersController.php

在上面代码中,由于 show() 方法传参时声明了类型 —— Eloquent 模型 User,对应的变量名 $user 会匹配路由片段中的 {user},这样,Laravel 会自动注入与请求 URI 中传入的 ID 对应的用户模型实例。

路由模型绑定

此功能称为 『隐性路由模型绑定』,是『约定优于配置』设计范式的体现,同时满足以下两种情况,此功能即会自动启用:

  1. 路由声明时必须使用 Eloquent 模型的单数小写格式来作为路由片段参数,User 对应 {user}

Route::get('/users/{user}', 'UsersController@show')->name('users.show');

在使用资源路由 Route::resource('users', 'UsersController'); 时,默认已经包含了上面的声明。

  1. 控制器方法传参中必须包含对应的 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 方法,将数据与视图进行绑定。

你可能感兴趣的:(用户资源控制器)