管理员的Laravel Mass Assignment

Jus*_*tin 3 php roles mass-assignment laravel laravel-4

我有一个带有Users表的Users表的应用程序:id|name|email|is_admin.我希望管理员能够将其他用户设置为管理员.

models/User.php我防止大规模分配:

protected $fillable = ['name', 'email'];
Run Code Online (Sandbox Code Playgroud)

Laravel 4基于角色的质量分配得出结论,Laravel没有这样的功能.

我的问题是,什么是可行的解决方案?如何才允许管理员更新数据库中的"is_admin"列?

Geo*_*ins 5

扩展您的用户模型以创建没有批量分配保护的仅限管理员的版本.

在新类中,覆盖$fillable属性:

class UnprotectedUser extends User
{
    protected $fillable = [<all fields>];
}
Run Code Online (Sandbox Code Playgroud)

然后在管理员特定代码中使用新模型:

$user = UnprotectedUser::create($arrayOfAllFields);
Run Code Online (Sandbox Code Playgroud)

务必在尽可能多的地方使用原始课程,以便继续利用质量分配保护.

  • 这是一个很好的答案,因为它允许您继续使用内置的:: create()功能进行批量分配. (2认同)

The*_*pha 5

其实就是下面的代码:

protected $fillable = ['name', 'email'];
Run Code Online (Sandbox Code Playgroud)

将阻止Mass-Assignment这意味着有人不能使用这样的东西:

User::create(['name' => 'xxx', 'email' =>'x@mail.com', 'is_admin' => 1]);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,该is_admin字段不会更新,但仍然可以使用类似的东西做同样的事情(它不是Mass Assignment):

$user = User::find($id); // Or $user = new User; (when creating a new user);
$user->name = 'xxx';
$user->email = 'x@mail.com';
$user->is_admin = 1;
$user->save();
Run Code Online (Sandbox Code Playgroud)

User所以这样更新就不会出现问题了。

  • 我最终使用了这个答案,因为它允许模型具有更大的灵活性。例如,在 update() 上,我只想在传入新密码时修改用户密码。 (2认同)