Laravel的观察者和事件的用法

//01观察者



    Eloquent 模型会触发许多事件(Event),我们可以对模型的生命周期内多个时间点进行监控: 
creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored。
事件让你每当有特定的模型类在数据库保存或更新时,执行代码。当一个新模型被初次保存将会触发 creating 以及 created 事件。
如果一个模型已经存在于数据库且调用了 save 方法,将会触发 updating 和 updated 事件。在这两种情况下都会触发 saving 和 saved 事件。
    Eloquent 观察器允许我们对给定模型中进行事件监控,观察者类里的方法名对应 Eloquent 想监听的事件。每种方法接收 model 作为其唯一的参数。


1,创建文件app/Observers/模型Observer.php


2,注册的方式


    1)在模型中注册
   
  protected $dispatchesEvents = [
            'saved' => UserSaved::class,
            'deleted' => UserDeleted::class,
        ];



    
    2)在 AppServiceProvider 中注册观察者
     
       /**
         * 运行所有应用服务.
         *
         * @return void
         */
        public function boot()
        {
            User::observe(UserObserver::class);
        }


        
3,编辑监听需观察者类 在模型Observer.php中


    每个方法接受 model 作为唯一参数。Laravel 不包含观察者的默认目录,所以你可以创建任何你喜欢的目录来存放观察者类.
    
   
        
       
 namespace App\Observers;
        
        use App\User;
        
        class UserObserver
        {
            /**
             * 监听创建用户事件.
             *
             * @param  \App\User  $user
             * @return void
             */
            public function created(User $user)
            {
                //
            }
        
            /**
             * 监听删除用户事件.
             *
             * @param  \App\User  $user
             * @return void
             */
            public function deleting(User $user)
            {
                //
            }
        }






总结:对于模型的 增、删、改、查 的相关事件,使用观察者类更为方便。




//02 事件



1,在EventServiceProvider中注册 监听器 和 事件
    例:
       
 /**
          * 应用程序的事件监听器映射。
          *
          * @var array
          */
        protected $listen = [
            'App\Events\OrderShipped' => [
                'App\Listeners\SendShipmentNotification',
                ...,
                ...,可以监听多个事件
            ],
        ];




2,生成事件 & 监听器


        为每个事件和监听器手动创建文件是件很麻烦的事情,
    而在这里,你只需将监听器和事件添加到 EventServiceProvider 中,
    再使用 event:generate 命令即可。这个命令会生成在 EventServiceProvider 
    中列出的所有事件和监听器。当然,已经存在的事件和监听器将保持不变。
    
  
  php artisan event:generate


    
3,我们进入app\Events目录的事件类中
    
        namespace App\Events;
        
        class Register
        {
        
            public $uid;
        
            /**
             * 创建一个新的事件实例.
             *
             * @param  Order  $order
             * @return void
             */
            public function __construct($uid)
            {
                $this->uid = $uid;
            }
        }
        
        这样就可以了。
        
4,然后去app\Listeners目录进入事件监听类。

        
       
 namespace App\Listeners;
        
        use App\Events\Register;
        use App\Models\User;
        use Illuminate\Contracts\Queue\ShouldQueue;
        
        class SendHelpInformation implements ShouldQueue
        {
            
            
            public function __construct()
            {
                //
            }
        
           
            public function handle(Register $event)
            {
                $uid = $event->uid;
                
                $user = User::find($uid);
                
                //......各种实现
            }
        }

总结:这个handle方法就是我们要做的具体实现了,有个很方便的功能就是如果 implements ShouldQueue这个接口的话就会 异步队列执行
      如果 去掉的话就是 同步执行。很方便有没有,这样代码就解耦了,不需要再管注册代码了,在这里就能很方便的管理了。多人开发也是单独写自己的Listeners就可以了。

你可能感兴趣的:(laravel)