当前位置:首页 > PHP教程 > php高级应用 > 列表

Laravel 5.1中定义事件、事件监听器以及触发事件例子

发布:smiling 来源: PHP粉丝网  添加日期:2018-09-14 13:32:19 浏览: 评论:0 

这里我们基于之前基于模型+缓存对文章增删改查这篇文件对文章保存后缓存的处理做进一步优化。我们将文章保存(新建/修改)视为一个事件,将保存文章内容到缓存放到监听器中实现:

1、注册事件-监听器

首先我们需要在EventServiceProvider中注册事件与监听器之间的映射关系:

  1. protected $listen = [ 
  2.     'App\Events\PostSaved'=>[
  3.         'App\Listeners\SaveDataToCache'
  4.     ]<br> 
  5. ]; 

然后我们在项目根目录运行如下Artisan命令:

php artisan event:generate

该命令会在app/Events目录下生成PostSaved.php,在app/Listeners目录下生成SaveDataToCache.php。

2、定义事件类

接下来我们编辑事件类PostSaved如下:

  1. <?php 
  2.    namespace App\Events; 
  3.    use App\Events\Event; 
  4.  
  5. use App\Models\Post; 
  6.  
  7. use Illuminate\Queue\SerializesModels; 
  8.  
  9. use Illuminate\Contracts\Broadcasting\ShouldBroadcast; 
  10.    class PostSaved extends Event 
  11.  
  12.  
  13.     use SerializesModels; 
  14.        /** 
  15.  
  16.      * Create a new event instance. 
  17.  
  18.      * 
  19.  
  20.      * @return void 
  21.  
  22.      */ 
  23.  
  24.     public function __construct(Post $post
  25.  
  26.     { 
  27.  
  28.         $this->post = $post
  29.  
  30.     } 
  31.        /** 
  32.  
  33.      * Get the channels the event should be broadcast on. 
  34.  
  35.      * 
  36.  
  37.      * @return array 
  38.  
  39.      */ 
  40.  
  41.     public function broadcastOn() 
  42.  
  43.     { 
  44.  
  45.         return []; 
  46.  
  47.     } 
  48.  

我们在构造函数中注入一个Post实例传递给PostSaved。

3、定义监听器类

然后我们来定义监听器类SaveDataToCache,监听器类中使用handle方法接收事件实例并执行响应该事件的业务逻辑,这里就是将就接收到的Post实例保存到缓存中:

  1. <?php 
  2.    namespace App\Listeners; 
  3.    use App\Events\PostSaved; 
  4.  
  5. use Cache; 
  6.  
  7. use Log; 
  8.  
  9. use Illuminate\Queue\InteractsWithQueue; 
  10.  
  11. use Illuminate\Contracts\Queue\ShouldQueue; 
  12.    class SaveDataToCache 
  13.  
  14.  
  15.     /** 
  16.  
  17.      * Create the event listener. 
  18.  
  19.      * 
  20.  
  21.      * @return void 
  22.  
  23.      */ 
  24.  
  25.     public function __construct() 
  26.  
  27.     { 
  28.  
  29.         // 
  30.  
  31.     } 
  32.        /** 
  33.  
  34.      * Handle the event. 
  35.  
  36.      * 
  37.  
  38.      * @param PostSaved $event 
  39.  
  40.      * @return void 
  41.  
  42.      */ 
  43.  
  44.     public function handle(PostSaved $event
  45.  
  46.     { 
  47.  
  48.         $post = $event->post; 
  49.  
  50.         $key = 'post_'.$post->id; 
  51.  
  52.         Cache::put($key,$post,60*24*7); 
  53.  
  54.         Log::info('保存文章到缓存成功!',['id'=>$post->id,'title'=>$post->title]); 
  55.  
  56.     } 
  57.  

业务逻辑很简单:从注入的PostSaved中获取文章实例并将其保存到缓存,并将该操作记录到日志。

4、触发事件

最后我们来测试文章保存事件及其监听器。

要触发文章保存事件,可以使用Event门面提供的fire方法,在PostController中修改store方法如下:

  1. public function store(Request $request
  2.  
  3.  
  4.     $title = $request->input('title'); 
  5.  
  6.     $content = $request->input('content'); 
  7.     $post = new Post; 
  8.  
  9.     $post->title = $title
  10.  
  11.     $post->content = $content
  12.  
  13.     $post->save(); 
  14.         Event::fire(new PostSaved($post)); 
  15.         return redirect()->route('post.show',['post'=>$post]); 
  16.  

然后修改update方法如下:

  1. public function update(Request $request, $id) 
  2.  
  3.  
  4.     $post = Post::find($id); 
  5.  
  6.     if(!$post) 
  7.  
  8.         exit('指定文章不存在!'); 
  9.     $title = $request->input('title'); 
  10.  
  11.     $content = $request->input('content'); 
  12.     $post->title = $title; 
  13.  
  14.     $post->content = $content; 
  15.  
  16.     $post->save(); 
  17.         Event::fire(new PostSaved($post)); 
  18.         return redirect()->route('post.show',['post'=>$post]); 
  19.  

在浏览器中访问http://laravel.app:8000/post/create,填写标题和文章内容:

点击提交页面跳转到文章详情页,此时去查看日志storage/logs/laravel.log,可以看到对应日志记录:

[2015-11-10 23:14:12] local.INFO: 保存文章到缓存成功! {"id":13,"title":"Test Event Add"}

说明已触发文章保存事件,监听器监听到事件后将其保存到缓存中并记录日志。

Tags: 事件 监听器 例子

分享到: