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

Jim*_*m D 3 laravel eloquent laravel-4 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();
    }

}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,不应该允许在任何情况下更新这些模型,并且我希望我的应用程序在尝试更新它们时爆炸.如果没有覆盖Eloquent的save()方法,有没有更简洁的方法呢?

Ala*_*orm 6

Eloquent 的事件系统允许您通过以下方式取消写操作

  1. 监听creating, updating, saving, or deleting事件

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

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

Foo::creating(function($foo)
{
    return false; //no one gets to create something
});
Run Code Online (Sandbox Code Playgroud)

在您的app/start/global.php文件中可以完成这项工作。


Jar*_*zyk 5

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

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

    Event::listen('eloquent.saving: *', function ($model) {
      return false;
    });
    
    Run Code Online (Sandbox Code Playgroud)
  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;
       });
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 对于只读模式,你只需要一个saving事件侦听器返回false,那么所有:Model::create,$model->save(),$model->update()将被拒绝.

  4. 这里的一切雄辩的事件列表:booting,booted,creating,created,saving,saved,updating,updated,deleting,deleted,也restoringrestored提供SoftDeletingTrait.