目录
注册事件以及监听器
定义事件
定义监听器
触发事件
首页 后端开发 php教程 Laravel 5.1 事件、事件监听的容易应用

Laravel 5.1 事件、事件监听的容易应用

Jun 13, 2016 pm 12:27 PM
app event function post

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">&#39;App\Events\BlogView&#39;</span> => <span class="ot">[</span>            <span class="st">&#39;App\Listeners\BlogViewListener&#39;</span><span class="ot">,</span>        <span class="ot">],</span>    <span class="ot">];</span></code>
登录后复制

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

<code class="sourceCode php">php artisan event:generate</code>
登录后复制

该命令完成后,会分别自动在 app/Eventsapp/Listensers目录下生成 BlogView.phpBlogViewListener.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">&#39;viewed_Blogs&#39;</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">&#39;viewed_Blogs.&#39;</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">&#39;home.blog.content&#39;</span><span class="ot">)</span>->withPost<span class="ot">(</span><span class="kw">$post</span><span class="ot">);</span>    }}</code>
登录后复制

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

京东商城APP如何进行实名认证 京东商城APP如何进行实名认证 Mar 19, 2024 pm 02:31 PM

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

注册香港AppleID的步骤及注意事项(畅享香港AppleStore的独特优势) 注册香港AppleID的步骤及注意事项(畅享香港AppleStore的独特优势) Sep 02, 2024 pm 03:47 PM

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

中国联通app怎么退订流量包 中国联通怎样退订流量包 中国联通app怎么退订流量包 中国联通怎样退订流量包 Mar 18, 2024 pm 10:10 PM

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

多点app如何开发票 多点app如何开发票 Mar 14, 2024 am 10:00 AM

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

个人所得税app怎么申报 个人所得税app申报方法 个人所得税app怎么申报 个人所得税app申报方法 Mar 12, 2024 pm 07:40 PM

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

Blackmagic 的专业级视频应用程序登陆 Android,但您的手机可能无法运行它 Blackmagic 的专业级视频应用程序登陆 Android,但您的手机可能无法运行它 Jun 25, 2024 am 07:06 AM

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

此应用程序需要Windows应用运行时 此应用程序需要Windows应用运行时 Feb 28, 2024 pm 05:37 PM

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

app全称是啥 app全称是啥 Aug 21, 2023 am 10:29 AM

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

See all articles