通常我们有这样的业务需求,如果Model的某个字段发生了变化,就做出对应的业务处理,那么怎么才能监测到字段的变化呢,Laravel的Eloquent Model模型为我们提供了一套解决方案。其实就是利用Observer监听Model。
执行命令
1 2 3 4 5 6
| 1、创建事件
php artisan make:observer AfterSaleObserver --model=Models/User
2、在 AppServiceProvider 里面注册事件
|
在 Observers
目录下回生成 UserObserver
文件
事件
Eloquent 的模型触发了几个事件,可以在模型的生命周期的以下几点进行监控: retrieved、creating、created、updating、updated、saving、saved、deleting、deleted、restoring、restored
。事件能在每次在数据库中保存或更新特定模型类时轻松地执行代码。
从数据库中检索现有模型时会触发 retrieved
事件。当新模型第一次被保存时, creating
以及 created
事件会被触发。如果模型已经存在于数据库中并且调用了 save
方法,会触发 updating
和 updated
事件。在这两种情况下,saving / saved
事件都会触发。
开始前,在 Eloquent 模型上定义一个 $dispatchesEvents
属性,将 Eloquent 模型的生命周期的各个点映射到你的 事件类 中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php
namespace App;
use App\Events\UserSaved; use App\Events\UserDeleted; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable { use Notifiable;
protected $dispatchesEvents = [ 'saved' => UserSaved::class, 'deleted' => UserDeleted::class, ]; }
|
观察器
如果要给某个模型监听很多事件,则可以使用观察器将所有监听器分组到一个类中。观察器类里的方法名应该对应 Eloquent 中你想监听的事件。 每种方法接收 model 作为其唯一的参数。Laravel 没有为观察器设置默认的目录,所以你可以创建任何你喜欢你的目录来存放:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| <?php
namespace App\Observers;
use App\User;
class UserObserver {
public function created(User $user) { $user->getOriginal('status'); $user->getOriginal(); }
public function updated (User $user) {
$newStatus = $user->status; $oldStatus = $user->getOriginal('status'); $oldUser = $user->getOriginal();
if ($newStatus != $oldStatus) { Logger::info($user->getOriginal()); }
}
public function deleting(User $user) { } }
|
要注册一个观察器,需要在模型上使用 observe
方法。你可以在服务提供器中的 boot
方法注册观察器。在这个例子中,我们将在 AppServiceProvider
注册观察器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| <?php
namespace App\Providers;
use App\User; use App\Observers\UserObserver; use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider {
public function boot() { User::observe(UserObserver::class); }
public function register() { } }
|