是否有一种简单的方法可以防止在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()
方法,有没有更简洁的方法呢?
答案 0 :(得分:5)
除了@ AlanStorm的回答,这里还有一个全面的信息:
您可以为所有模型设置全局侦听器:
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;
});
}
对于只读模型,您只需要一个saving
事件侦听器返回false,然后全部:Model::create
,$model->save()
,$model->update()
将被拒绝。< / p>
以下是所有Eloquent事件的列表:booting
,booted
,creating
,created
,saving
,{{ 1 {},saved
,updating
,updated
,deleting
以及deleted
提供的restoring
和restored
。
答案 1 :(得分:3)
Eloquent event system允许您通过
取消写入操作聆听creating, updating, saving, or deleting
事件
从事件回调中返回false。
例如,为了防止人们创建新的模型对象,就像这样
Foo::creating(function($foo)
{
return false; //no one gets to create something
});
你app/start/global.php
文件中的可以胜任。