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
メソッドでイベント インスタンスを受け取ります。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 増加していることがわかります。すべてが完了しました。