Laravel: 如何在保存 | 更新之后或之前创建函数

我需要生成一个函数来调用之后或之前保存()或更新() ,但我不知道如何做。 我想我需要一个来自 save () update ()的回调函数,但是我不知道该怎么做。 谢谢

121179 次浏览

使用此命令创建提供程序

php artisan make:provider ProviderClassName

然后在引导函数中定义模型的回调函数

Model::created(function($model){
//Do you want to do
});

可用回调列表:

Model::creating(function($model){});
Model::updated(function($model){});
Model::updating(function($model){});
Model::deleted(function($model){});
Model::deleting(function($model){});
Model::saving(function($model){});
Model::saved(function($model){});

在您的模型中,您可以添加一个 Boot ()方法,该方法允许您管理这些事件。

例如,使用 User.php 模型:

class User extends Model
{


public static function boot()
{
parent::boot();


self::creating(function($model){
// ... code here
});


self::created(function($model){
// ... code here
});


self::updating(function($model){
// ... code here
});


self::updated(function($model){
// ... code here
});


self::deleting(function($model){
// ... code here
});


self::deleted(function($model){
// ... code here
});
}


}

您可以在这里查看所有可用的事件: https://laravel.com/docs/5.2/eloquent#events

这只有在模型上发生事件之后才能正常工作

方法1,使用观察者

为模型创建一个观察者

php artisan make:observer UserObserver --model=User

这将在您的模型上创建一个事件观察器

class UserObserver
{
/**
* Handle the User "created" event.
*
* @param  \App\Models\User  $user
* @return void
*/
public function created(User $user)
{
//
}


/**
* Handle the User "updated" event.
*
* @param  \App\Models\User  $user
* @return void
*/
public function updated(User $user)
{
//
}


/**
* Handle the User "deleted" event.
*
* @param  \App\Models\User  $user
* @return void
*/
public function deleted(User $user)
{
//
}


/**
* Handle the User "forceDeleted" event.
*
* @param  \App\Models\User  $user
* @return void
*/
public function forceDeleted(User $user)
{
//
}
}

您必须在某个 ServiceProvider 上的引导方法中注册此观察器,最好是 AppServiceProvider

// App\Providers\AppServiceProvider.php


public function boot()
{
User::observe(UserObserver::class);
}

方法2,使用闭包

可以在模型的静态引导方法中注册自定义事件

<?php


namespace App;


use Illuminate\Database\Eloquent\Model;


class User extends Model
{
/**
* The "booted" method of the model.
*
* @return void
*/
protected static function boot()
{
parent::boot();
static::created(function ($user) {
//
});
}
}

可观察到的事件

// Illuminate\Database\Eloquent\Concerns


/**
* Get the observable event names.
*
* @return array
*/
public function getObservableEvents()
{
return array_merge(
[
'retrieved', 'creating', 'created', 'updating', 'updated',
'saving', 'saved', 'restoring', 'restored', 'replicating',
'deleting', 'deleted', 'forceDeleted', 'trashed'
],
$this->observables
);
}

Laravel 文档中的注释

当通过 Eloquent 发出大规模更新时,不会为更新的模型触发保存、保存、更新和更新的模型事件。这是因为在发出大规模更新时,实际上从未检索到模型。