這里我們基于之前基于模型+緩存對文章增刪改查這篇文件對文章保存后緩存的處理做進一步優化。我們將文章保存(新建/修改)視為一個事件,將保存文章內容到緩存放到監聽器中實現:
1、注冊事件-監聽器
首先我們需要在EventServiceProvider中注冊事件與監聽器之間的映射關系:
- protected $listen = [
- 'App/Events/PostSaved'=>[
- 'App/Listeners/SaveDataToCache'
- ]<br>
- ];
然后我們在項目根目錄運行如下Artisan命令:
php artisan event:generate
該命令會在app/Events目錄下生成PostSaved.php,在app/Listeners目錄下生成SaveDataToCache.php。
2、定義事件類
接下來我們編輯事件類PostSaved如下:
- <?php
- namespace App/Events;
- use App/Events/Event;
- use App/Models/Post;
- use Illuminate/Queue/SerializesModels;
- use Illuminate/Contracts/Broadcasting/ShouldBroadcast;
- class PostSaved extends Event
- {
- use SerializesModels;
- /**
- * Create a new event instance.
- *
- * @return void
- */
- public function __construct(Post $post)
- {
- $this->post = $post;
- }
- /**
- * Get the channels the event should be broadcast on.
- *
- * @return array
- */
- public function broadcastOn()
- {
- return [];
- }
- }
我們在構造函數中注入一個Post實例傳遞給PostSaved。
3、定義監聽器類
然后我們來定義監聽器類SaveDataToCache,監聽器類中使用handle方法接收事件實例并執行響應該事件的業務邏輯,這里就是將就接收到的Post實例保存到緩存中:
- <?php
- namespace App/Listeners;
- use App/Events/PostSaved;
- use Cache;
- use Log;
- use Illuminate/Queue/InteractsWithQueue;
- use Illuminate/Contracts/Queue/ShouldQueue;
- class SaveDataToCache
- {
- /**
- * Create the event listener.
- *
- * @return void
- */
- public function __construct()
- {
- //
- }
- /**
- * Handle the event.
- *
- * @param PostSaved $event
- * @return void
- */
- public function handle(PostSaved $event)
- {
- $post = $event->post;
- $key = 'post_'.$post->id;
- Cache::put($key,$post,60*24*7);
- Log::info('保存文章到緩存成功!',['id'=>$post->id,'title'=>$post->title]);
- }
- }
業務邏輯很簡單:從注入的PostSaved中獲取文章實例并將其保存到緩存,并將該操作記錄到日志。
4、觸發事件
最后我們來測試文章保存事件及其監聽器。
要觸發文章保存事件,可以使用Event門面提供的fire方法,在PostController中修改store方法如下:
- public function store(Request $request)
- {
- $title = $request->input('title');
- $content = $request->input('content');
- $post = new Post;
- $post->title = $title;
- $post->content = $content;
- $post->save();
- Event::fire(new PostSaved($post));
- return redirect()->route('post.show',['post'=>$post]);
- }
然后修改update方法如下:
- public function update(Request $request, $id)
- {
- $post = Post::find($id);
- if(!$post)
- exit('指定文章不存在!');
- $title = $request->input('title');
- $content = $request->input('content');
- $post->title = $title;
- $post->content = $content;
- $post->save();
- Event::fire(new PostSaved($post));
- return redirect()->route('post.show',['post'=>$post]);
- }
在瀏覽器中訪問http://laravel.app:8000/post/create,填寫標題和文章內容:
點擊提交頁面跳轉到文章詳情頁,此時去查看日志storage/logs/laravel.log,可以看到對應日志記錄:
[2015-11-10 23:14:12] local.INFO: 保存文章到緩存成功! {"id":13,"title":"Test Event Add"}
說明已觸發文章保存事件,監聽器監聽到事件后將其保存到緩存中并記錄日志。
新聞熱點
疑難解答