>백엔드 개발 >PHP 튜토리얼 >Laravel 51 이벤트 및 이벤트 청취의 간단한 애플리케이션

Laravel 51 이벤트 및 이벤트 청취의 간단한 애플리케이션

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB원래의
2016-07-29 09:11:22957검색

?
Laravel 51 事件、事件监听的简单应用

가끔 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/Eventsapp/Listensers 디렉터리에 각각 자동으로 생성됩니다. BlogView.phpBlogViewListener.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 명령은 자동으로 적절한 이벤트 클래스를 가져오고 핸들 메서드에 힌트 이벤트를 입력합니다.

메서드 내에서 이벤트에 대한 응답으로 필요한 논리를 수행할 수 있습니다. handlehandle

<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>
일부 논리도 주석에 설명되어 있습니다. .

트리거 이벤트

이벤트 및 이벤트 모니터링이 완료된 후 전체 모니터링을 구현해야 합니다. 즉, 사용자가 기사 이벤트를 열도록 트리거하는 것입니다.

에서 제공하는

메소드는 다음과 같습니다. Eventfire

<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 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.