Laravel 5.1 事件、事件监听的容易应用
Laravel 5.1 事件、事件监听的简单应用
?
有时候当我们单纯的看 Laravel
手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作中多加思考会发现有时候这些服务其实我们一直都见过。下面就事件、事件监听举一个很简单的例子你就会发现。
? 这个例子是关于文章的浏览数的实现,当用户查看文章的时候文章的浏览数会增加1,用户查看文章就是一个事件,有了事件,就需要一个事件监听器,对监听的事件发生后执行相应的操作(文章浏览数加1),其实这种监听机制在 Laravel
中是通过观察者模式实现的.
注册事件以及监听器
首先我们需要在 app/Providers/
目录下的EventServiceProvider.php
中注册事件监听器映射关系,如下:
<code class="sourceCode php"><span class="kw">protected</span> <span class="kw">$listen</span> = <span class="ot">[</span> <span class="st">'App\Events\BlogView'</span> => <span class="ot">[</span> <span class="st">'App\Listeners\BlogViewListener'</span><span class="ot">,</span> <span class="ot">],</span> <span class="ot">];</span></code>
然后项目根目录下执行如下命令
<code class="sourceCode php">php artisan event:generate</code>
该命令完成后,会分别自动在 app/Events
和app/Listensers
目录下生成 BlogView.php
和BlogViewListener.php
文件。
定义事件
<code class="sourceCode php"><span class="kw"><?php</span><span class="kw">namespace</span> App\Events<span class="ot">;</span><span class="kw">use</span> App\Events\Event<span class="ot">;</span><span class="kw">use</span> App\Post<span class="ot">;</span><span class="kw">use</span> Illuminate\Queue\SerializesModels<span class="ot">;</span><span class="kw">use</span> Illuminate\Contracts\Broadcasting\ShouldBroadcast<span class="ot">;</span><span class="kw">class</span> BlogView <span class="kw">extends</span> Event{ <span class="kw">use</span> SerializesModels<span class="ot">;</span> <span class="co">/**</span><span class="co"> * Create a new event instance.</span><span class="co"> *</span><span class="co"> * </span><span class="kw">@return</span><span class="co"> void</span><span class="co"> */</span> <span class="kw">public</span> <span class="kw">function</span> <span class="fu">__construct</span><span class="ot">(</span>Post <span class="kw">$post</span><span class="ot">)</span> { <span class="kw">$this</span>->post = <span class="kw">$post</span><span class="ot">;</span> } <span class="co">/**</span><span class="co"> * Get the channels the event should be broadcast on.</span><span class="co"> *</span><span class="co"> * </span><span class="kw">@return</span><span class="co"> array</span><span class="co"> */</span> <span class="kw">public</span> <span class="kw">function</span> broadcastOn<span class="ot">()</span> { <span class="kw">return</span> <span class="ot">[];</span> }}</code>
其实看到这些你会发现该事件类只是注入了一个 Post
实例罢了,并没有包含多余的逻辑。
定义监听器
事件监听器在handle
方法中接收事件实例,event:generate命令将会自动在handle方法中导入合适的事件类和类型提示事件。在handle
方法内,你可以执行任何需要的逻辑以响应事件,我们的代码实现如下:
<code class="sourceCode php"><span class="kw"><?php</span><span class="kw">namespace</span> App\Listeners<span class="ot">;</span><span class="kw">use</span> App\Events\BlogView<span class="ot">;</span><span class="kw">use</span> Illuminate\Queue\InteractsWithQueue<span class="ot">;</span><span class="kw">use</span> Illuminate\Contracts\Queue\ShouldQueue<span class="ot">;</span><span class="kw">use</span> Illuminate\Session\Store<span class="ot">;</span><span class="kw">class</span> BlogViewListener{ <span class="kw">protected</span> <span class="kw">$session</span><span class="ot">;</span> <span class="co">/**</span><span class="co"> * Create the event listener.</span><span class="co"> *</span><span class="co"> * </span><span class="kw">@return</span><span class="co"> void</span><span class="co"> */</span> <span class="kw">public</span> <span class="kw">function</span> <span class="fu">__construct</span><span class="ot">(</span>Store <span class="kw">$session</span><span class="ot">)</span> { <span class="kw">$this</span>->session = <span class="kw">$session</span><span class="ot">;</span> } <span class="co">/**</span><span class="co"> * Handle the event.</span><span class="co"> *</span><span class="co"> * </span><span class="kw">@param</span><span class="co"> </span><span class="kw">BlogView</span><span class="co"> $event</span><span class="co"> * </span><span class="kw">@return</span><span class="co"> void</span><span class="co"> */</span> <span class="kw">public</span> <span class="kw">function</span> handle<span class="ot">(</span>BlogView <span class="kw">$event</span><span class="ot">)</span> { <span class="kw">$post</span> = <span class="kw">$event</span>->post<span class="ot">;</span> <span class="co">//先进行判断是否已经查看过</span> <span class="kw">if</span> <span class="ot">(</span>!<span class="kw">$this</span>->hasViewedBlog<span class="ot">(</span><span class="kw">$post</span><span class="ot">))</span> { <span class="co">//保存到数据库</span> <span class="kw">$post</span>->view_cache = <span class="kw">$post</span>->view_cache + <span class="dv">1</span><span class="ot">;</span> <span class="kw">$post</span>->save<span class="ot">();</span> <span class="co">//看过之后将保存到 Session </span> <span class="kw">$this</span>->storeViewedBlog<span class="ot">(</span><span class="kw">$post</span><span class="ot">);</span> } } <span class="kw">protected</span> <span class="kw">function</span> hasViewedBlog<span class="ot">(</span><span class="kw">$post</span><span class="ot">)</span> { <span class="kw">return</span> <span class="fu">array_key_exists</span><span class="ot">(</span><span class="kw">$post</span>->id<span class="ot">,</span> <span class="kw">$this</span>->getViewedBlogs<span class="ot">());</span> } <span class="kw">protected</span> <span class="kw">function</span> getViewedBlogs<span class="ot">()</span> { <span class="kw">return</span> <span class="kw">$this</span>->session->get<span class="ot">(</span><span class="st">'viewed_Blogs'</span><span class="ot">,</span> <span class="ot">[]);</span> } <span class="kw">protected</span> <span class="kw">function</span> storeViewedBlog<span class="ot">(</span><span class="kw">$post</span><span class="ot">)</span> { <span class="kw">$key</span> = <span class="st">'viewed_Blogs.'</span>.<span class="kw">$post</span>->id<span class="ot">;</span> <span class="kw">$this</span>->session->put<span class="ot">(</span><span class="kw">$key</span><span class="ot">,</span> <span class="fu">time</span><span class="ot">());</span> }}</code>
注释中也已经说明了一些逻辑。
触发事件
事件和事件监听完成后,我们要做的就是实现整个监听,即触发用户打开文章事件在此我们使用和 Event
提供的 fire
方法,如下:
<code class="sourceCode php"><span class="kw"><?php</span><span class="kw">namespace</span> App\Http\Controllers<span class="ot">;</span><span class="kw">use</span> Illuminate\Http\Request<span class="ot">;</span><span class="kw">use</span> App\Post<span class="ot">;</span><span class="kw">use</span> Illuminate\Support\Facades\Event<span class="ot">;</span><span class="kw">use</span> App\Http\Requests<span class="ot">;</span><span class="kw">use</span> App\Events\BlogView<span class="ot">;</span><span class="kw">use</span> App\Http\Controllers\Controller<span class="ot">;</span><span class="kw">class</span> BlogController <span class="kw">extends</span> Controller{ <span class="kw">public</span> <span class="kw">function</span> showPost<span class="ot">(</span><span class="kw">$slug</span><span class="ot">)</span> { <span class="kw">$post</span> = Post::whereSlug<span class="ot">(</span><span class="kw">$slug</span><span class="ot">)</span>->firstOrFail<span class="ot">();</span> Event::fire<span class="ot">(</span><span class="kw">new</span> BlogView<span class="ot">(</span><span class="kw">$post</span><span class="ot">));</span> <span class="kw">return</span> view<span class="ot">(</span><span class="st">'home.blog.content'</span><span class="ot">)</span>->withPost<span class="ot">(</span><span class="kw">$post</span><span class="ot">);</span> }}</code>
现在打开页面发现数据库中的`view_cache已经正常加1了,这样整个就完成了。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

京东商城APP实名认证怎么弄?京东商城是很多朋友经常使用的一款网上购物平台,大家在购物之前,最好先进行实名认证,这样才能享受到完整的服务,获得更好的购物体验。下面带来京东商城实名认证方法,希望对网友们有所帮助。1、安装并打开京东商城,接着登录个人账号;2、然后点击页面下方【我的】,进入个人中心页面;3、之后再点击右上角的【设置】小图标,前往设置功能界面;4、选择【账号与安全】这一项,来到账户设置页面;5、最后再点击【实名认证】选项,前往填写实名信息;6、安装系统要求填写个人真实信息,完成实名认证

在全球范围内,Apple公司的产品和服务一直备受用户喜爱。注册一个香港AppleID将带给用户更多的便利和特权,让我们一起来了解一下注册香港AppleID的步骤以及需要注意的事项。如何注册香港AppleID在使用苹果设备时,很多应用和功能都需要使用AppleID进行登录。如果您想下载香港地区的应用或享受香港AppStore的优惠内容,那么注册一个香港AppleID就非常必要。本文将详细介绍如何注册香港AppleID的步骤以及需要注意的事项。步骤:选择语言与地区:在苹果设备上找到“设置”选项,进入

中国联通app能够轻松的满足大家的使用,多样的功能,解决你们的需求,想要办理各种业务,都可以在这里轻松的搞定,有不需要的都可以在这里及时的退订掉,有效的避免后续的损失,很多人在使用手机时,有时感觉流量不够用,就购买了额外的流量包,但下个月又不想要要,就想要马上的退订掉,在这里小编为大家提供退订的方法,让需要的小伙伴们,都可以前来使用起来! 在中国联通app中,找到右下角的“我的”选项,点击它。 在我的界面里,滑动我的服务一栏,点击其中的“我已订购”选

发票作为购物凭证,对于我们的日常生活和工作都至关重要。那么我们平时在使用多点app进行购物的时候,如何在多点app中轻松开具发票呢?下文中本站小编就将为大家带来详细的多点app开设发票详细操作步骤攻略,想要了解的用户们千万不容错过,快来跟着文本一起操作了解一下吧!在【发票中心】点击【多点超市/自由购】在已完成的订单页中选择需要开票的订单,点击下一步填写【发票信息】,【收件人信息】,确认无误后点击提交过个几分钟后,进入收件邮箱,打开邮件,点击电子发票下载地址最后,下载打印电子发票

个人所得税app怎么申报?个人所得税是一款实用性非常强大的手机软件,用户可以在这个软件上面进行申报一些业务,还可以在这个软件上面进行退税等。只要用户有将这个软件下载下来,就可以不用去线下排队等办理了,非常方便。很多用户到现在都还不清楚怎么用个人所得税软件进行申报,下面小编整理了个人所得税软件的申报方法,供大家参考。个人所得税app申报方法 1、首先,打开软件,在首页找到并点击“我要办税”按键; 2、然后,在这里的税费申报中找到并点击“综合所得年度汇算&rdquo

Blackmagic Design 终于将其广受好评的 Blackmagic Camera 应用程序带到了 Android 平台。专业摄像机应用程序可免费下载,并提供完整的手动控制。这些控制旨在让您更轻松地获得专业级 cin

WindowsAppRuntime或WinRT就像微软创建的工具箱。它帮助开发人员在许多设备上构建和运行应用程序,如计算机、平板电脑、手机、Xbox等。在运行应用程序时,如果您收到此应用程序需要WindowsAppRuntime的错误消息,请遵循此帖子以解决该问题。为什么会出现此错误?WindowsAppRuntime是一个强大的工具,可以帮助开发人员在各种设备上构建和运行应用程序,包括计算机、平板电脑、手机、Xbox和HoloLens。如果您收到提示需要WindowsAppRuntime来运行

app全称是“Application”,即应用程序的缩写,是指针对移动设备开发的一种软件应用。app的出现为用户提供了更多种类的移动应用程序选择,满足了用户在不同场景下的各类需求。app的开发过程涉及到软件设计、编程、测试等多个环节,同时也需要考虑设备兼容性、性能优化、安全性等方面的问题。
