防止对 Laravel Eloquent 模型进行某些 CRUD 操作

Prevent Certain CRUD Operations on Laravel Eloquent Models

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

我现在是怎么做的(根据记忆,我认为我缺少与 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() 方法?

Eloquent 的 event system 允许您通过

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

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

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

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

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

除了@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() 将被拒绝了。

  4. 这是所有 Eloquent 事件的列表:bootingbootedcreatingcreatedsavingsavedupdatingupdateddeletingdeleted 以及 restoringrestored 由 [=28= 提供].