从my_items_table
删除记录时,我想将记录插入my_items_table_archive
。
我可以在每个Controller上执行此操作,但是更喜欢挂钩到Eloquent模型。
有这样的东西吗?
伪代码:
class MyItem extends Model {
protected function beforeDelete($record) {
MyItemArchive::create($record); // add record the archive
return true; // continue deletion of $record
}
}
有什么主意吗?谢谢!
答案 0 :(得分:4)
是的,有些类似于您的伪代码。
您可以利用Eloquent Events
下面是一个很好的例子:
protected $dispatchesEvents = [
'deleted' => UserDeleted::class,
'deleting' => UserDeleting::class
];
所讨论的课程只需要遵守/请遵循:Listeners
您还可以使用雄辩的观察者/观察者模式来获得相似的结果。
让我知道你的生活吧!
答案 1 :(得分:2)
首先使用创建一个新的观察者
php artisan make:observer MyItemObserver
然后
<?php
namespace App\Observers;
class MyItemObserver
{
public function deleting(MyItem $myItem)
{
/// insert new record here
}
}
现在您进入您的appServiceProvider
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
MyItem::observe(MyItemObserver::class);
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
现在,您的观察者服务器将被挂接到模型事件。
希望这会有所帮助。
答案 2 :(得分:1)
如official documentation中所述,使用事件有两种选择。第一个是创建像这样的观察者:
class MyModelObserver
{
/**
* Listen to the Model deleting event.
*
* @param User $user
* @return void
*/
public function deleting(User $user)
{
// HERE YOUR CODE TO TRANSFER THE MODEL
}
}
您不必在AppServiceProvider
上注册它
public function boot {
MyModel::observe(MyModelObserver::class)
}
否则,您可以通过生成特定的类将这些事件添加到模型中:
protected $dispatchesEvents = [
'deleting' => MyModelDeletingEvent::class,
];
无论如何,如果您使用的laravel版本低于5.4,则应检查文档以了解具体的实现方式,因为$dispatchesEvents
不能作为变量使用。