防止对 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 允许您通过
取消 写操作
侦听 creating, updating, saving, or deleting
事件
从您的事件回调中返回 false。
例如,为了防止人们创建新的模型对象,像这样
Foo::creating(function($foo)
{
return false; //no one gets to create something
});
在您的 app/start/global.php
文件中就可以完成这项工作。
除了@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()
将被拒绝了。
这是所有 Eloquent 事件的列表:booting
、booted
、creating
、created
、saving
、saved
、updating
、updated
、deleting
、deleted
以及 restoring
和 restored
由 [=28= 提供].
有没有一种简单的方法可以防止某些 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 允许您通过
取消 写操作侦听
creating, updating, saving, or deleting
事件从您的事件回调中返回 false。
例如,为了防止人们创建新的模型对象,像这样
Foo::creating(function($foo)
{
return false; //no one gets to create something
});
在您的 app/start/global.php
文件中就可以完成这项工作。
除了@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()
将被拒绝了。这是所有 Eloquent 事件的列表:
booting
、booted
、creating
、created
、saving
、saved
、updating
、updated
、deleting
、deleted
以及restoring
和restored
由 [=28= 提供].