?
가끔 Laravel
매뉴얼만 읽어도 시스템 서비스에 따른 인증과 이벤트, 이러한 기능적 서비스의 적용 시나리오 등 의문이 들 때가 있습니다. 사실, 특정 개발 경험을 경험하지 못했다면 이런 의문이 드는 것이 정상이지만, 직장에서 좀 더 생각해보면 가끔 이런 서비스를 실제로 본 적이 있다는 것을 알게 될 것입니다. 전에. 다음은 이벤트 및 이벤트 모니터링에 대한 매우 간단한 예이며 이를 알게 될 것입니다.
? 이 예는 사용자가 기사를 볼 때 기사 조회수가 1 증가합니다. 사용자가 기사를 볼 때 이벤트입니다. 이벤트가 발생하면 이벤트 리스너가 필요합니다. (기사 조회수 1 증가) 실제로 이 모니터링 메커니즘은 Laravel
이벤트 및 리스너 등록
먼저 다음과 같이
디렉토리 아래에 이벤트 리스너 app/Providers/
매핑 관계 EventServiceProvider.php
를 등록해야 합니다.
<code><span>protected</span><span>$listen</span> = <span>[</span><span>'App\Events\BlogView'</span> => <span>[</span><span>'App\Listeners\BlogViewListener'</span><span>,</span><span>],</span><span>];</span></code>그리고 프로젝트 루트
<code>php artisan event:generate</code>디렉토리에서 다음 명령을 실행합니다. 명령이 완료되면 및
파일이 app/Events
및 app/Listensers
디렉터리에 각각 자동으로 생성됩니다. BlogView.php
BlogViewListener.php
이벤트 정의
<code><span><?php</span><span>namespace</span> App\Events<span>;</span><span>use</span> App\Events\Event<span>;</span><span>use</span> App\Post<span>;</span><span>use</span> Illuminate\Queue\SerializesModels<span>;</span><span>use</span> Illuminate\Contracts\Broadcasting\ShouldBroadcast<span>;</span><span>class</span> BlogView <span>extends</span> Event { <span>use</span> SerializesModels<span>;</span><span>/**</span><span> * Create a new event instance.</span><span> *</span><span> * </span><span>@return</span><span> void</span><span> */</span><span>public</span><span>function</span><span>__construct</span><span>(</span>Post <span>$post</span><span>)</span> { <span>$this</span>->post = <span>$post</span><span>;</span> } <span>/**</span><span> * Get the channels the event should be broadcast on.</span><span> *</span><span> * </span><span>@return</span><span> array</span><span> */</span><span>public</span><span>function</span> broadcastOn<span>()</span> { <span>return</span><span>[];</span> } }</span></code>실제로 이것을 보면 이벤트 클래스가 의 인스턴스를 주입할 뿐이며 다음을 포함하지 않는다는 것을 알 수 있습니다. 중복 논리.
Post
리스너 정의
이벤트 리스너는
메서드에서 이벤트 인스턴스를 수신합니다. event:generate 명령은 자동으로 적절한 이벤트 클래스를 가져오고 핸들 메서드에 힌트 이벤트를 입력합니다. 메서드 내에서 이벤트에 대한 응답으로 필요한 논리를 수행할 수 있습니다. handle
handle
<code><span><?php</span><span>namespace</span> App\Listeners<span>;</span><span>use</span> App\Events\BlogView<span>;</span><span>use</span> Illuminate\Queue\InteractsWithQueue<span>;</span><span>use</span> Illuminate\Contracts\Queue\ShouldQueue<span>;</span><span>use</span> Illuminate\Session\Store<span>;</span><span>class</span> BlogViewListener { <span>protected</span><span>$session</span><span>;</span><span>/**</span><span> * Create the event listener.</span><span> *</span><span> * </span><span>@return</span><span> void</span><span> */</span><span>public</span><span>function</span><span>__construct</span><span>(</span>Store <span>$session</span><span>)</span> { <span>$this</span>->session = <span>$session</span><span>;</span> } <span>/**</span><span> * Handle the event.</span><span> *</span><span> * </span><span>@param</span><span>BlogView</span><span> $event</span><span> * </span><span>@return</span><span> void</span><span> */</span><span>public</span><span>function</span> handle<span>(</span>BlogView <span>$event</span><span>)</span> { <span>$post</span> = <span>$event</span>->post<span>;</span><span>//先进行判断是否已经查看过</span><span>if</span><span>(</span>!<span>$this</span>->hasViewedBlog<span>(</span><span>$post</span><span>))</span> { <span>//保存到数据库</span><span>$post</span>->view_cache = <span>$post</span>->view_cache + <span>1</span><span>;</span><span>$post</span>->save<span>();</span><span>//看过之后将保存到 Session </span><span>$this</span>->storeViewedBlog<span>(</span><span>$post</span><span>);</span> } } <span>protected</span><span>function</span> hasViewedBlog<span>(</span><span>$post</span><span>)</span> { <span>return</span><span>array_key_exists</span><span>(</span><span>$post</span>->id<span>,</span><span>$this</span>->getViewedBlogs<span>());</span> } <span>protected</span><span>function</span> getViewedBlogs<span>()</span> { <span>return</span><span>$this</span>->session->get<span>(</span><span>'viewed_Blogs'</span><span>,</span><span>[]);</span> } <span>protected</span><span>function</span> storeViewedBlog<span>(</span><span>$post</span><span>)</span> { <span>$key</span> = <span>'viewed_Blogs.'</span>.<span>$post</span>->id<span>;</span><span>$this</span>->session->put<span>(</span><span>$key</span><span>,</span><span>time</span><span>());</span> } }</span></code>일부 논리도 주석에 설명되어 있습니다. .
트리거 이벤트
이벤트 및 이벤트 모니터링이 완료된 후 전체 모니터링을 구현해야 합니다. 즉, 사용자가 기사 이벤트를 열도록 트리거하는 것입니다.
에서 제공하는 메소드는 다음과 같습니다. Event
fire
<code><span><?php</span><span>namespace</span> App\Http\Controllers<span>;</span><span>use</span> Illuminate\Http\Request<span>;</span><span>use</span> App\Post<span>;</span><span>use</span> Illuminate\Support\Facades\Event<span>;</span><span>use</span> App\Http\Requests<span>;</span><span>use</span> App\Events\BlogView<span>;</span><span>use</span> App\Http\Controllers\Controller<span>;</span><span>class</span> BlogController <span>extends</span> Controller { <span>public</span><span>function</span> showPost<span>(</span><span>$slug</span><span>)</span> { <span>$post</span> = Post::whereSlug<span>(</span><span>$slug</span><span>)</span>->firstOrFail<span>();</span> Event::fire<span>(</span><span>new</span> BlogView<span>(</span><span>$post</span><span>));</span><span>return</span> view<span>(</span><span>'home.blog.content'</span><span>)</span>->withPost<span>(</span><span>$post</span><span>);</span> } }</span></code>이제 페이지를 열고 데이터베이스의 `view_cache가 정상적으로 1 증가했음을 확인합니다. 모든 것이 완료되었습니다.
위 내용은 개발 경험과 관계 매핑을 포함하여 Laravel 51 이벤트 및 이벤트 모니터링의 간단한 응용 프로그램을 소개하며 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.