laravel之事件

快速生成
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传入
    }
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,280评论 19 139
  • 事件 简介 laravel 的事件提供了一种简单的观察者实现。它允许你在应用中进行订阅和监听事件。事件类通常都是存...
    Dearmadman阅读 3,622评论 0 3
  • 对于Android开发老司机来说肯定不会陌生,它是一个基于观察者模式的事件发布/订阅框架,开发者可以通过极少的代码...
    飞扬小米阅读 1,495评论 0 50
  • Dependency Inversion Principle 动机 我们设计软件应用时,可以将完成基础操作(磁盘访...
    holysu阅读 1,580评论 0 2
  • 你从南极走来 那块冰封的大陆上 一片虚无空白 从未有过花开 你牵着我的手 不再燥热难耐 走过每一条街道 一起看凉凉...
    木木鲨阅读 91评论 0 2