在Laravel Eloquent模型中防止特定的CRUD操作

7

有没有一种简单的方法来防止在Eloquent模型上执行某些CRUD操作?

目前的做法(根据我的记忆,我认为我缺少与Eloquent的save()兼容的参数,但这不重要):

<?php

class Foo extends Eloquent {

    public function save()
    {
        // Prevent Foo from being updated.
        if (!empty($this->id)) {
            throw new \Exception('Update functionality is not allowed.');
        }

        parent::save();
    }

}

在这种情况下,这些模型不应该被任何情况下更新,如果有什么尝试更新它们的操作,我希望我的应用程序会崩溃。是否有更干净的方法在不覆盖Eloquent的save()方法的情况下实现这一点?

你可以设置可填写字段,并在设置数据库时使它们不为空,但这样做会违反许多良好的原则。在Laravel 5中,您可以创建FormRequests。http://mattstauffer.co/blog/laravel-5.0-form-requests#4.-create-your-formrequest - Rosmarine Popcorn
2个回答

14

除了 @AlanStorm 的回答外,以下是全面的信息:

  1. 您可以为所有模型设置全局监听器:

Event::listen('eloquent.saving: *', function ($model) {
  return false;
});
  • 或者对于给定的模型:

  • Event::listen('eloquent.saving: User', function ($user) {
      return false;
    });
    // or
    User::saving(function ($user) {
      return false;
    });
    
    // If it's not global, but for single model, then I would place it in boot():
    // SomeModel
    public static function boot()
    {
       parent::boot();
    
       static::saving(function ($someModel) {
          return false;
       });
    }
    
  • 对于只读模型,您只需要一个返回 false 的 saving 事件监听器,然后所有的操作:Model::create$model->save()$model->update() 都将被拒绝。

  • 以下是所有 Eloquent 事件的列表:bootingbootedcreatingcreatedsavingsavedupdatingupdateddeletingdeleted,以及由 SoftDeletingTrait 提供的 restoringrestored


  • 7
    Eloquent的事件系统允许您通过以下方式取消写操作:
    1. 监听creating, updating, saving或deleting事件

    2. 从您的事件回调中返回false。

    例如,要防止用户创建新模型对象,可以像这样进行设置:
    Foo::creating(function($foo)
    {
        return false; //no one gets to create something
    });
    

    在你的app/start/global.php文件中会起作用。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接