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 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

Jingdong Mall APP에서 실명인증을 받는 방법은 무엇입니까? Jingdong Mall은 많은 친구들이 자주 사용하는 온라인 쇼핑 플랫폼입니다. 쇼핑하기 전에 모든 사람이 완전한 서비스를 즐기고 더 나은 쇼핑 경험을 얻을 수 있도록 실명 인증을 수행하는 것이 가장 좋습니다. 다음은 JD.com 실명인증 방법입니다. 네티즌분들께 도움이 되었으면 좋겠습니다. 1. JD.com을 설치하고 열고 개인 계정에 로그인합니다. 2. 그런 다음 페이지 하단의 [내]를 클릭하여 개인 센터 페이지로 들어갑니다. 3. 그런 다음 화면에서 작은 [설정] 아이콘을 클릭합니다. 오른쪽 상단에서 설정 기능 인터페이스로 이동합니다. 4. [계정 및 보안]을 선택하여 계정 설정 페이지로 이동합니다. 5. 마지막으로 [실명 인증] 옵션을 클릭하여 실명 정보를 입력합니다. 설치시스템에서는 실제 개인정보를 입력하고 실명인증을 완료해야 합니다.

Apple의 제품과 서비스는 항상 전 세계 사용자들에게 사랑을 받아왔습니다. 홍콩 Apple ID를 등록하면 사용자에게 더 많은 편리함과 특권이 제공됩니다. 홍콩 Apple ID를 등록하는 단계와 주의해야 할 사항을 살펴보겠습니다. 홍콩 Apple ID를 등록하는 방법 Apple 장치를 사용할 때 많은 응용 프로그램과 기능에 로그인하려면 Apple ID를 사용해야 합니다. 홍콩에서 애플리케이션을 다운로드하거나 홍콩 AppStore의 특혜 콘텐츠를 즐기려면 홍콩 Apple ID를 등록하는 것이 매우 필요합니다. 이 기사에서는 홍콩 Apple ID를 등록하는 방법과 주의해야 할 사항에 대한 단계를 자세히 설명합니다. 단계: 언어 및 지역 선택: Apple 장치에서 "설정" 옵션을 찾아 입력하세요.

China Unicom 앱은 모든 사람의 요구를 쉽게 충족할 수 있습니다. 다양한 서비스를 처리하고 싶다면 여기에서 제때에 구독을 취소할 수 있습니다. 후속 손실을 피하기 위해 많은 사람들이 휴대폰을 사용할 때 데이터가 충분하지 않다고 느껴 추가 데이터 패키지를 구입하지만 다음 달에 원하지 않으면 즉시 구독을 취소하려는 경우가 있습니다. 에디터가 설명하는 구독 취소 방법을 제공하여, 필요한 친구들이 와서 사용할 수 있도록 해드립니다! China Unicom 앱의 오른쪽 하단에 있는 "내" 옵션을 찾아 클릭하세요. 내 인터페이스에서 내 서비스 열을 슬라이드하고 "주문했습니다" 옵션을 클릭하세요.

앱의 정식 명칭은 "애플리케이션(Application)"으로, 애플리케이션 프로그램(Application Program)의 약자로 모바일 기기용으로 개발된 소프트웨어 애플리케이션을 의미합니다. 앱의 출현은 사용자에게 더욱 다양한 모바일 애플리케이션 선택권을 제공하여 다양한 시나리오에서 다양한 사용자 요구를 충족시킵니다. 앱 개발 프로세스에는 소프트웨어 설계, 프로그래밍, 테스트 등 다양한 측면이 포함되며, 장치 호환성, 성능 최적화, 보안과 같은 문제도 고려해야 합니다.

구매 증빙 자료인 송장은 우리의 일상 생활과 업무에 매우 중요합니다. 그럼 우리가 평소 듀오디안 앱을 사용해 쇼핑을 할 때, 듀오디안 앱에서 쉽게 송장을 발행할 수 있는 방법은 무엇일까요? 아래에서 이 웹사이트의 편집자가 멀티 포인트 앱에서 송장을 개설하는 방법에 대한 자세한 단계별 가이드를 제공합니다. 더 알고 싶은 사용자는 이 내용을 놓치지 마세요. [송장센터]에서 [다점슈퍼마켓/무료쇼핑]을 클릭하고, 완료된 주문페이지에서 송장발행이 필요한 주문을 선택한 후, 다음을 클릭하여 [송장정보], [수취인정보]를 입력한 후, 몇 분 후 수신 메일함을 입력하여 이메일을 열고 전자 청구서 다운로드 주소를 클릭한 후 마지막으로 전자 청구서를 다운로드하여 인쇄하세요.

Blackmagic Design은 마침내 호평을 받은 Blackmagic Camera 앱을 Android에 출시했습니다. 전문 비디오 카메라 앱은 무료로 다운로드할 수 있으며 완전한 수동 제어 기능을 제공합니다. 이러한 컨트롤은 프로 수준의 cin을 더 쉽게 수강할 수 있도록 하는 것을 목표로 합니다.

WindowsAppRuntime 또는 WinRT는 Microsoft에서 만든 도구 상자와 같습니다. 개발자가 컴퓨터, 태블릿, 휴대폰, Xbox 등과 같은 다양한 장치에서 애플리케이션을 구축하고 실행하는 데 도움이 됩니다. 애플리케이션을 실행하는 동안 이 애플리케이션에 WindowsAppRuntime이 필요하다는 오류 메시지가 표시되면 이 게시물에 따라 문제를 해결하세요. 이 오류는 왜 발생합니까? Windows 앱 런타임은 개발자가 컴퓨터, 태블릿, 휴대폰, Xbox 및 HoloLens를 포함한 다양한 장치에서 응용 프로그램을 구축하고 실행하는 데 도움이 되는 강력한 도구입니다. WindowsAppRuntime을 실행해야 한다는 메시지가 표시되는 경우

PHP는 웹사이트 개발에 널리 사용되는 프로그래밍 언어이며, 페이지 점프와 POST 데이터 전달은 웹사이트 개발의 일반적인 요구 사항입니다. 이 기사에서는 특정 코드 예제를 포함하여 PHP 페이지 점프를 구현하고 POST 데이터를 전달하는 방법을 소개합니다. PHP에서 페이지 점프는 일반적으로 헤더 기능을 통해 구현됩니다. 점프 프로세스 중에 POST 데이터를 전달해야 하는 경우 다음 단계를 통해 수행할 수 있습니다. 먼저 사용자가 정보를 채우고 제출 버튼을 클릭하는 양식이 포함된 페이지를 만듭니다. 형태의 액티
