当前位置:首页 > Lumen - 事件监听,一个非常有用的模式

Lumen - 事件监听,一个非常有用的模式

发布于 2018-04-23 阅读 1560 次 框架 设计模式 PHP Lumen

事件(Event)

什么是事件呢?

它是一个动作
鼠标点击页面 - 点击事件
usb插入电脑 - 插入事件
打开电脑 - 开机事件

那我们在什么时候去使用事件呢?

场景

用户在注册网站后,我们需要发送一封验证邮件
用户在点击查看谋篇文章后,我们给这个文章的阅读数增加

这些我们都可以用事件来处理

使用

注册事件监听器

app/Providers/EventServiceProvider.php

  1. namespace App\Providers;
  2. use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;
  3. class EventServiceProvider extends ServiceProvider
  4. {
  5. /**
  6. * 注册事件,事件监听者.
  7. * 文章点击事件和监听者
  8. * @var array
  9. */
  10. protected $listen = [
  11. 'App\Events\ArticleClickEvent' => [
  12. 'App\Listeners\ArticleClickListener',
  13. ],
  14. ];
  15. }

创建事件器

app/Events/ArticleClickEvent.php

  1. namespace App\Events;
  2. use App\Models\Article;
  3. /**
  4. * ArticleClickEvent.php
  5. *
  6. * 文章事件
  7. *
  8. * @category PHP
  9. * @package w2le.com
  10. * @author w2le.com
  11. */
  12. class ArticleClickEvent
  13. {
  14. /**
  15. * 创建一个文章对象属性
  16. *
  17. *
  18. * @var App\Models\Article
  19. */
  20. protected $article;
  21. /**
  22. * Create a new event instance.
  23. *
  24. * @return void
  25. */
  26. public function __construct(Article $article)
  27. {
  28. //把文章对象传入ArticleClickEvent中
  29. $this->article = $article;
  30. }
  31. }

创建事件监听者

app/Listeners/ArticleClickListener.php

  1. /**
  2. * ArticleClickListener.php
  3. *
  4. * 文章事件监听者
  5. *
  6. * @category PHP
  7. * @package w2le.com
  8. * @author w2le.com
  9. */
  10. namespace App\Listeners;
  11. use App\Events\ArticleClickEvent;
  12. class ArticleClickListener
  13. {
  14. /**
  15. * Create the event listener.
  16. *
  17. * @return void
  18. */
  19. public function __construct()
  20. {
  21. //
  22. }
  23. /**
  24. * Handle the event.
  25. *
  26. * @param ArticleClickEvent $event
  27. * @return void
  28. */
  29. public function handle(ArticleClickEvent $event)
  30. {
  31. //获取ArticleClickEvent中我们传入的article对象
  32. $article = $event->article
  33. //有了article对象我们可以对文章进行操作
  34. //通过文章id更新文章阅读数
  35. updateArticleViews($article->id)
  36. }
  37. }

使用事件

app/Http/Controllers/Article.php

  1. //文章详情
  2. public function index()
  3. {
  4. do something
  5. ...
  6. //通过文章id获取文章
  7. $article = Article::find($id)
  8. //雇佣文章点击监听事件
  9. Event::fire(new ArticleClickEvent($article));
  10. }

通过事件模式,我们可以把主业务跟支线业务逻辑做到很好的拆分
如上面提到的文章详情页面显示,我们只需要关心文章的展示。而文章其他相关的业务放到我们的监听事件里面来实行
这样不但简化了我们的controller逻辑,同时也极大的解耦了我们的业务

如果这时候在我们需要在文章查看后,需要给用户发一封邮件,你会怎么做呢?
是不是只需要在文章事件里增加一个邮件发送的处理就行了,这样还不需要修改controller中的代码