Laravel5.1事件、事件监听的简单应用

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

​

有时候当我们单纯的看Laravel手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作中多加思考会发现有时候这些服务其实我们一直都见过。下面就事件、事件监听举一个很简单的例子你就会发现。

​ 这个例子是关于文章的浏览数的实现,当用户查看文章的时候文章的浏览数会增加1,用户查看文章就是一个事件,有了事件,就需要一个事件监听器,对监听的事件发生后执行相应的操作(文章浏览数加1),其实这种监听机制在Laravel中是通过观察者模式实现的.

注册事件以及监听器首先我们需要在app/PRoviders/目录下的EventServiceProvider.php中注册事件监听器映射关系,如下:

protected$listen=['App\Events\BlogView'=>['App\Listeners\BlogViewListener',],];

然后项目根目录下执行如下命令

php artisan event:generate

该命令完成后,会分别自动在app/Events和app/Listensers目录下生成BlogView.php和BlogViewListener.php文件。

定义事件<?phpnamespaceApp\Events;useApp\Events\Event;useApp\Post;useIlluminate\Queue\SerializesModels;useIlluminate\Contracts\Broadcasting\ShouldBroadcast;classBlogViewextendsEvent

{useSerializesModels;/*** Create a new event instance.**@returnvoid*/publicfunction__construct(Post$post){$this->post =$post;}/*** Get the channels the event should be broadcast on.**@returnarray*/publicfunction

broadcastOn(){return[];}

}

其实看到这些你会发现该事件类只是注入了一个Post实例罢了,并没有包含多余的逻辑。

定义监听器事件监听器在handle方法中接收事件实例,event:generate命令将会自动在handle方法中导入合适的事件类和类型提示事件。在handle方法内,你可以执行任何需要的逻辑以响应事件,我们的代码实现如下:

<?phpnamespaceApp\Listeners;useApp\Events\BlogView;useIlluminate\Queue\InteractsWithQueue;useIlluminate\Contracts\Queue\ShouldQueue;useIlluminate\session\Store;classBlogViewListener

{protected$session;/*** Create the event listener.**@returnvoid*/publicfunction__construct(Store$session){$this->session =$session;}/*** Handle the event.**@paramBlogView$event*@returnvoid*/publicfunctionhandle(BlogView$event){$post=$event->post;//先进行判断是否已经查看过if(!$this->hasViewedBlog($post)){//保存到数据库$post->view_cache =$post->view_cache +1;$post->save();//看过之后将保存到 Session$this->storeViewedBlog($post);}

}protectedfunctionhasViewedBlog($post){returnarray_key_exists($post->id,$this->getViewedBlogs());}protectedfunctiongetViewedBlogs(){return$this->session->get('viewed_Blogs',[]);}protectedfunctionstoreViewedBlog($post){$key='viewed_Blogs.'.$post->id;$this->session->put($key,time());}

}

注释中也已经说明了一些逻辑。

触发事件事件和事件监听完成后,我们要做的就是实现整个监听,即触发用户打开文章事件在此我们使用和Event提供的fire方法,如下:

<?phpnamespaceApp\Http\Controllers;useIlluminate\Http\Request;useApp\Post;useIlluminate\Support\Facades\Event;useApp\Http\Requests;useApp\Events\BlogView;useApp\Http\Controllers\Controller;classBlogControllerextendsController

{publicfunctionshowPost($slug){$post= Post::whereSlug($slug)->firstOrFail();Event::fire(newBlogView($post));returnview('home.blog.content')->withPost($post);}

}

现在打开页面发现数据库中的`view_cache已经正常加1了,这样整个就完成了。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航