laravel中模型中$fillable的用法

在Laravel框架中,$fillable 属性在模型(Model)中扮演着至关重要的角色。它是Laravel Eloquent ORM系统提供的一个安全特性,用于防止所谓的“批量赋值漏洞”(Mass Assignment Vulnerability)。本文将深入探讨 $fillable的用途、如何使用它以及为何它如此重要。

$fillable属性的用途

在日常开发过程中,我们经常需要从用户那里接收数据,并将这些数据保存到数据库中。Laravel提供了方便的批量赋值(Mass Assignment)功能,使得开发者可以一次性赋值多个属性。然而,这项功能如果没有适当的限制,也可能带来安全风险。攻击者可能会通过批量赋值漏洞,向数据库写入不应被修改的字段。为了解决这个问题,Laravel引入了 $fillable属性,让我们定义哪些字段可以被批量赋值。

使用 $fillable

在Laravel的Eloquent模型中,$fillable是一个数组,包含了可以被批量赋值的字段名。通过设置这个属性,任何不在该数组中的字段都不会被批量赋值,从而提高了应用程序的安全性。

举个例子,假设我们有一个 User模型,包含 nameemail, 和 password字段。如果希望这三个字段都可以通过批量赋值来更新,则可以在 User模型中设置如下:

class User extends Model
{
    protected $fillable = ['name', 'email', 'password'];
}

现在,如果我们使用Eloquent的 create方法或是在实例化模型后调用 fill方法,只有在 $fillable数组中列出的字段会被赋值。

$user = User::create([
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'password' => 'secret',
    'is_admin' => 1 // 假设这是不希望通过用户输入直接赋值的字段
]);

由于 is_admin字段没有在 $fillable数组中指定,它不会被批量赋值,从而保证了数据的安全性。

$fillable与 $guarded

Laravel提供了另外一个与 $fillable对立的属性 $guarded。与 $fillable指定"哪些字段可以被批量赋值"不同,$guarded指定的是"哪些字段不可以被批量赋值"。

一般情况下,应该只使用其中一种方法来保护你的模型,要么是 $fillable,要么是 $guarded。使用两者中的一种,根据具体场景和个人偏好选择最适合你的项目的那个。

在PHP中使用命令自动生成模型类Student,需要使用Laravel框架的Artisan命令行工具。首先,需要在终端中进入Laravel项目的根目录,然后运行以下命令: ``` php artisan make:model Student -m ``` 这个命令会生成一个名为Student的模型类,并且会同时生成一个与模型类对应的迁移文件,用于创建students表。在生成迁移文件时,可以使用--create选项指定表名,如: ``` php artisan make:model Student -m --create=students ``` 接下来,在生成的Student模型类中添加$table、$timestamps和$fillable属性,如下所示: ```php <?php namespace App; use Illuminate\Database\Eloquent\Model; class Student extends Model { protected $table = 'students'; // 指定数据表名 public $timestamps = true; // 开启自动维护时间戳 protected $fillable = ['name', 'age', 'gender']; // 指定可批量赋值的属性 } ``` 其中,$table属性用于指定模型对应的数据表名,$timestamps属性用于控制是否自动维护created_at和updated_at字段,$fillable属性用于指定可以通过模型的create()方法批量赋值的属性。 最后,需要在students表中添加测试数据,可以使用Laravel的Seeder和Factory来实现。首先,需要在终端中运行以下命令生成一个Student模型的Seeder: ``` php artisan make:seeder StudentSeeder ``` 然后,在生成的StudentSeeder类中编写填充数据的逻辑,如下所示: ```php <?php use Illuminate\Database\Seeder; use App\Student; class StudentSeeder extends Seeder { public function run() { factory(Student::class, 10)->create(); } } ``` 以上代码使用了Laravel的Factory来生成10条Student模型的测试数据。最后,运行以下命令执行seeder填充数据: ``` php artisan db:seed --class=StudentSeeder ``` 执行完毕后,即可在students表中查看到添加的测试数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值