Laravel中模型事件什么意思?
Laravel已经实现定义了不少的模型事件:
creating
, created
, updating
, updated
, saving
, saved
, deleting
, deleted
, restoring
, restored
如上名称,代表在具体的模型中,当发生:正在新增、已新增、已更新...模型时,要去触发的一些事件。
Laravel中有三种方法来定义模型事件。
这里全部以用户创建时为例(creating)
数据库这些实现就创建好了:
1.events属性
无道愣是没测试成功,估计哪步没对。
就是在模型文件中定义一些属性
A. 在app/Providers/EventServiceProvider.php定义
代码语言:javascript复制class EventServiceProvider extends ServiceProvider
{
protected $listen = [
'AppEventsUserEvent' => [
'AppListenersUserListener',
],
];
}
AppEventsUserEvent和 AppListenersUserListener按照模型名称自定义修改即可。
然后运行:
代码语言:javascript复制php artisan event:generate
就会生成event和listener文件:
B. listen 中handle 方法注入对应事件类
代码语言:javascript复制class UserListener
{
public function handle(UserEvent $event)
{
dd('修改什么?');
}
}
C. 最后在 模型中添加 'events' 属性
代码语言:javascript复制class User extends Authenticatable
{
use Notifiable;
protected $events = [
'saved' => UserEvent::class,
];
}
2.观察者
A. 先定义一个观察者
代码语言:javascript复制<?php
namespace AppObserver;
use AppUser;
class UserObserver
{
/**
* 监听用户创建事件.
*
* @param User $user
* @return void
*/
public
function created(User $user)
{
}
/**
* 监听用户创建/更新事件.
*
* @param User $user
* @return void
*/
public
function saved(User $user)
{
//
}
}
B. 在某个服务提供者的boot方法中注册观察者:
代码语言:javascript复制<?php
namespace AppProviders;
use AppObserverUserObserver;
use AppUser;
use IlluminateSupportServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
User::observe(UserObserver::class);
}
}
C. User模型中使用
代码语言:javascript复制class User extends Authenticatable
{
use Notifiable;
protected $observables = [
'created', 'creating', 'updating'
];
}
这里的$observables属性的值和UserObserver里面定义的方法名称一样。
D. 测试成功
路由:
代码语言:javascript复制Route::get('/', function () {
$user = User::find(1);
// $user->name = 'wudao';
// $user->save();
$user->update(['name' => 'wudao12']);
});
3.静态方法
还可以通过模型上的对应静态方法来定义一个事件,在EventServiceProvider的boot方法里面定义:
代码语言:javascript复制<?php
namespace AppProviders;
class EventServiceProvider extends ServiceProvider
{
public function boot()
{
parent::boot();
User::saved(function(User$user) {
});
User::updated('AppListenerUserListener@updated');
}
}