ホームページ >バックエンド開発 >PHPチュートリアル >Laravel 5.1イベントとイベントリスニングの簡単なアプリケーション

Laravel 5.1イベントとイベントリスニングの簡単なアプリケーション

WBOY
WBOYオリジナル
2016-06-13 12:27:44865ブラウズ

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/Eventsファイルがapp/ListensersBlogView.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

リスナーの定義

イベント リスナーは、

メソッドでイベント インスタンスを受け取ります。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 までご連絡ください。