Laravel

laravel之事件

2018-03-13  本文已影响14人  二B铅笔
快速生成
1.绑定事件和监听器
path:App\Providers\EventServiceProvider

 protected $listen = [
        'App\Events\TestEvent' => [
            'App\Listeners\TestEventListener',
        ],
    ];

2.执行命令,自动生成事件文件 和 监听器文件
   php artisan event:generate

注册事件

1.注入要操作的对象

path:App\Events\TestEvent

class TestEvent{
 ...
  public $user;
  public function __construct(User $user)
    {
       $this->user= $user;
    }
}

监听器(一对一处理事件)

1.handle方法使用注入的对象

path:App\Listeners\TestEventListener

class TestEventListener{
  public function handle(TestEvent $event)
    {
        //事件处理
        //读取事件中注入的对象中的属性
        Log::info($event->user->username);
        // return false;  //在handle中return false会停止事件传播
    }
}

2.队列监听器

继承ShouldQueue接口后,执行到这个监听器时会自动使用队列系统
执行成功会从队列中移除
执行失败时如果配置了failed()方法则调用这个方法来处理错误

path:App\Listeners\TestEventListener

class TestEventListener implements ShouldQueue{
   use InteractsWithQueue;  //用来手动操作队列的trait
    public $connection = 'dl';  //任务应该发送到的队列的连接的名称
    public $queue = 'listeners'; // 任务应该发送到的队列的名称

  public function handle(TestEvent $event)
    {
        //事件处理
        //读取事件中注入的对象中的属性
        Log::info($event->user->username);
        // return false;  //在handle中return false会停止事件传播
        if (true) {
            $this->release(30); //手动操作
        }
    }

  //处理队列任务执行失败
  public function failed(OrderShipped $event, $exception)
    {      
        Log::error('执行失败');
    }
}

3.绑定事件监听器

   path:App\Providers\EventServiceProvider

    //绑定事件和监听器
    protected $listen = [
        'App\Events\TestEvent' => [
            'App\Listeners\TestEventListener',
        ],
    ];

事件订阅者(一对多处理事件)

前面的事件和监听事件是一对一处理,而事件订阅者是指一个类订阅处理多个事件,从而允许你在单个类中定义一些事件处理器

1.创建事件订阅者,注册subscribe方法,监听处理多个事件

path:App\Listeners\TestEventListener

class TestEventListener{
    public function onTask(TestEvent $event)
    {
        //事件处理
        //读取事件中注入的对象中的属性
        Log::info($event->user->user_nickname);
    }

    public function subscribe($events)
    {
       //事件 和对应的处理方法
        $events->listen(
               'App\Events\TestEvent',
               'App\Listeners\TestEventListener@onTask'
          );
     ....
    }
 }

2.绑定事件订阅者

   path:App\Providers\EventServiceProvider

    //绑定事件订阅者
    protected $subscribe = [\App\Listeners\TestEventListener::class];

触发事件

path:App\Http\Controllers\MemberController 

  class MemberController extends BaseController{
    ....
    public function test()
    {
        $user = Member::find(12);  //获取用户Model
        Event(new \App\Events\TestEvent($user));//触发事件,将用户model传入
    }
 }
上一篇下一篇

猜你喜欢

热点阅读