【问题标题】:Laravel Mass Assignment for Admins面向管理员的 Laravel 批量分配
【发布时间】:2014-11-21 23:14:01
【问题描述】:

我有一个带有用户表的应用程序,其中包含以下列:id|name|email|is_admin。我希望管理员能够将其他用户设置为管理员。

models/User.php 中,我通过以下方式阻止批量分配:

protected $fillable = ['name', 'email'];

Laravel 4 Role Based Mass Assignment 的结论是 Laravel 没有这样的功能。

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

【问题讨论】:

    标签: php laravel laravel-4 roles mass-assignment


    【解决方案1】:

    其实如下代码:

    protected $fillable = ['name', 'email'];
    

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

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

    在这种情况下,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();
    

    所以像这样更新User是没有问题的。

    【讨论】:

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

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

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

    class UnprotectedUser extends User
    {
        protected $fillable = [<all fields>];
    }
    

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

    $user = UnprotectedUser::create($arrayOfAllFields);
    

    确保在尽可能多的地方使用原始类,以便您可以继续利用批量分配保护。

    【讨论】:

    • 这是一个很好的答案,因为它允许您继续使用内置的 ::create() 功能进行批量分配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2017-10-08
    • 1970-01-01
    • 2021-02-04
    相关资源
    最近更新 更多