【问题标题】:Prevent Certain CRUD Operations on Laravel Eloquent Models防止 Laravel Eloquent 模型上的某些 CRUD 操作
【发布时间】:2015-03-28 00:08:45
【问题描述】:

有没有一种简单的方法可以防止在 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() 方法的情况下做到这一点?

【问题讨论】:

  • 您可以设置 filablle 字段,并在设置数据库时使它们不为空,这样做会破坏很多好的原则。在 Laravel 5 上,你可以创建 FormRequests mattstauffer.co/blog/…

标签: laravel laravel-4 eloquent laravel-5


【解决方案1】:

除了@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-&gt;save()$model-&gt;update() 将被拒绝。

  4. 这是所有 Eloquent 事件的列表:bootingbootedcreatingcreatedsavingsaved、@9876543@33@、updated、@9876 deleted 以及 restoringrestoredSoftDeletingTrait 提供。

【讨论】:

    【解决方案2】:

    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 文件中就可以完成这项工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-17
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 2021-10-22
      相关资源
      最近更新 更多