Mass Assignment

0
视频
0
完成
0%
进度
0
分钟
0
完成
0%
进度

当我们给模型的 create 还有 update 方法传递一个数组的时候,会自动把数组里面的项目跟数据表里面的字段相匹配 ... 然后把这些数据放在数据库里,这就是 Mass Assignment ... 这种方法用起来很方便,因为我们不需要挨个去设置数据表里面的每个字段,还有跟它对应的值了 ...

不过这会暴露一个很严重的安全问题 ... 因为用户可以在本地去修改或者添加 input 字段,比如,在我们的数据表里,用户表里有一个用来标记用户是否是管理员的字段,叫做 admin ,如果是管理员,这个字段的值就会是 1 ...

这样当用户在创建或者修改用户帐号的时候,如果他添加了一个字段,叫做 admin ,字段的值设置成 1 。并且我们使用了 Mass Assignment

这样在创建或者更新帐户信息以后,这个用户的记录,admin 这个字段的值就会被设置成 1 。

因为这个原因,在默认情况下 Laravel 会禁止所有的字段使用 Mass Assignment ... 不过我们可以通过设置模型的 $fillable 属性,去指定一下,可以使用 Mass Assignment 的字段。

这个 $fillable 属性就相当于是一个白名单,也就是,这个属性的值就是可以使用 Mass Assignment 的字段,没在这里列出的其它的字段,都不能使用 Mass Assignment ... 如果你想设置一个黑名单的话 ... 可以设置一下 guarded 属性 .. 这样除了在 guarded 属性里指定的字段以外,其它的字段都可以使用 Mass Assignment  ...

实践

下面,我们去试一下 ... 打开 MovieController 这个控制器 ... 然后找到处理保存电影内容的方法 ... 就是这个 store 方法 ...

在这里,我们分别用 Input 类去获得用户填写的每一个表单元素里的值,再一个一个的把它们设置成对应的字段的值 ...

先注释掉这几行代码 ...

Input 类有一个 all 方法,可以获取到表单里面的所有的元素的值 ... 我们可以把用它得到的值,作为 create 方法的一个参数 ...

Movie::create(Input::all());

保存 ... 回到浏览器 ... 打开创建电影的页面 ... 输入点内容 ... 然后点击 发布 ...

在这里,会显示一个错误 ,MassAssignmentException ... 这是因为 Laravel 默认会禁止所有的字段使用 Mass Assignment ...

下面,我们可以去设置一下 Movie 模型的 $fillable 参数,去指定一下,可以使用 Mass Assignment 的字段。

打开 Movie.php ... 添加一个受保护的属性 ... 名字是 $fillable ... 它的值是一个数组 ... 数组里面的项目就是可以使用 Mass Assignment 的字段 ... 这里我们先只添加一个 movie_title 字段 ...

protected $fillable = array('movie_title');

保存 .. 回到浏览器 ... 打开创建电影的页面 ... 输入内容 ... 点击发布 ...

这次没有提示错误 ... 再打开数据库管理软件 ... 在 movies 这个表里面,可以找到刚才添加的这条记录 ...

不过这个记录只有 movie_title 这个字段有内容 ... movie_date,还有 movie_budget 这两个字段没有东西 ... 因为我们只设置了,可以让 movie_title 这个字段 Mass Assignment ... 其它的字段,需要再去单独设置一下它们的值 ...

先删掉这条记录 ...

再回到 Movie 模型 ... 在给 $fillable 属性添加点东西 ... 加上 movie_date ... 还有 movie_budget ...

保存 ... 回到浏览器 ... 再去创建一个电影内容 ...

点击发布 ...

打开数据库管理软件 ... 这次,你会发现新添加的这条记录里面 movie_title ,movie_date,还有 movie_budget 这几个字段都有值了 ...

只是用了一个 Input:all 得到表单里面的所有的数据 ... 因为我们用了 Mass Assignment ,并且在模型里面,设置了可以使用 Mass Assignment 的字段 ... 所以,在发布以后,这些字段会自动去匹配对应的表单元素里面的值 ...

在使用 Mass Assignment 这个方法的时候,要非常小心,我们只对一般的字段使用这种方法,对于其它比较敏感的字段,需要单独去处理。

0:00
2:25
0:00
0:00
0:00
3:54

Mass Assignment《 Laravel 数据库 》

统计

14696
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点