在Laravel Eloquent模型上防止某些CRUD操作

时间:2015-01-28 22:05:09

标签: laravel laravel-4 eloquent laravel-5

是否有一种简单的方法可以防止在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()方法,有没有更简洁的方法呢?

2 个答案:

答案 0 :(得分:5)

除了@ AlanStorm的回答,这里还有一个全面的信息:

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

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

    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;
       });
    }
    
  3. 对于只读模型,您只需要一个saving事件侦听器返回false,然后全部:Model::create$model->save()$model->update()将被拒绝。< / p>

  4. 以下是所有Eloquent事件的列表:bootingbootedcreatingcreatedsaving,{{ 1 {},savedupdatingupdateddeleting以及deleted提供的restoringrestored

答案 1 :(得分:3)

Eloquent event system允许您通过

取消写入操作
  1. 聆听creating, updating, saving, or deleting事件

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

  3. 例如,为了防止人们创建新的模型对象,就像这样

    Foo::creating(function($foo)
    {
        return false; //no one gets to create something
    });
    
    app/start/global.php文件中的

    可以胜任。