下面话不多说了,来一起看看详细的先容吧。
先来看看如何利用模型事宜,文档里面写了两种方法,实际上统共有三种办法可以定义一个模型事宜,这里以saved事宜来做例子,其他事宜都一样。
1.events属性

直接上代码:
class User extends Authenticatable { use Notifiable; protected $events = [ 'saved' => UserSaved::class, ];}
这个比较难以理解,而且文档并没有详细解释,刚开始以为saved被触发后会调用UserSaved里面的handle方法,实际上并不是。这个数组只是对事宜做的一个映射,它定义了在模型的saved的时候会触发UserSaved这个事宜,我们还要定义该事宜以及其监听器才可以:
namespace App\Events;use App\User;class UserSaved { public $user; public function __construct(User $user){ $this->user = $user; }}
namespace App\Listeners;class UserSavedListener { public function handle(UserSaved $userSaved){ dd($userSaved); }}
然后还要到EventServiceProvider中去注册该事宜和监听器:
class EventServiceProvider extends ServiceProvider{ / The event listener mappings for the application. @var array / protected $listen = [ 'App\Events\UserSaved' => [ 'App\Listeners\UserSavedListener', ] ]; / Register any events for your application. @return void / public function boot() { parent::boot(); }}
这样在saved节点的时候,UserSaved事宜会被触发,其监听器UserSavedListener的handle方法会被调用。
2.不雅观察者
这是文档比较推崇的一个模型事宜定义方法,也比较好理解,先定义一个不雅观察者:
use App\User;class UserObserver{ / 监听用户创建事宜. @param User $user @return void / public function created(User $user) { // } / 监听用户创建/更新事宜. @param User $user @return void / public function saved(User $user) { // }}
然后在某个做事供应者的boot方法中注册不雅观察者:
namespace App\Providers;use App\User;use App\Observers\UserObserver;use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider{ / Bootstrap any application services. @return void / public function boot() { User::observe(UserObserver::class); } / Register the service provider. @return void / public function register() { // }}
这样在模型事宜触发的时候,UserObserver的相应方法就会被调用。实在,在利用不雅观察者的时候,除了一些系统自带的,我们还可以定义一些自己的事宜:
class User extends Authenticatable { use Notifiable; protected $observables = [ 'customing', 'customed' ];}
然后在不雅观察者里面定义同名方法
class UserObserver{ / 监听用户创建/更新事宜. @param User $user @return void / public function saved(User $user) { // } public function customing(User $user){ } public function customed(User $user){ }}
由于是我们自己定义的事宜,以是触发的时候也必须手动触发,在须要触发的地方调用模型里面的一个fireModelEvent方法即可。不过由于该方法是protected的,以是只能在自己定义的模型方法里面,当然如果通过反射来调用,或容许以直接在$user工具上触发也说不定,这个我没试,大家可以自行测试下。
class User extends Authenticatable { use Notifiable; protected $observables = [ 'customing', 'awesoming' ]; public function custom(){ if ($this->fireModelEvent('customing') === false) { return false; } //TODO if ($this->fireModelEvent('customed') === false) { return false; } }}
3.静态方法定义
我们还可以通过模型上的对应静态方法来定义一个事宜,在EventServiceProvider的boot方法里面定义:
class EventServiceProvider extends ServiceProvider{ / Register any events for your application. @return void / public function boot() { parent::boot(); User::saved(function(User$user) { }); User::saved('UserSavedListener@saved'); }}
通过静态方法定义的时候,可以直接通报进入一个闭包,也可以定义为某个类的方法,事宜触发时候通报进入的参数便是该模型实例。
点击理解更多去学习:非常利用的代码优化,怎么才能写好代码https://www.toutiao.com/i6731724936789885444/