国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

Laravel 5.1中定義事件、事件監聽器以及觸發事件例子

2024-05-04 21:50:11
字體:
來源:轉載
供稿:網友

這里我們基于之前基于模型+緩存對文章增刪改查這篇文件對文章保存后緩存的處理做進一步優化。我們將文章保存(新建/修改)視為一個事件,將保存文章內容到緩存放到監聽器中實現:

1、注冊事件-監聽器

首先我們需要在EventServiceProvider中注冊事件與監聽器之間的映射關系:

  1. protected $listen = [ 
  2.     'App/Events/PostSaved'=>[
  3.         'App/Listeners/SaveDataToCache'
  4.     ]<br> 
  5. ]; 

然后我們在項目根目錄運行如下Artisan命令:

php artisan event:generate

該命令會在app/Events目錄下生成PostSaved.php,在app/Listeners目錄下生成SaveDataToCache.php。

2、定義事件類

接下來我們編輯事件類PostSaved如下:

  1. <?php 
  2.    namespace App/Events; 
  3.    use App/Events/Event; 
  4.  
  5. use App/Models/Post; 
  6.  
  7. use Illuminate/Queue/SerializesModels; 
  8.  
  9. use Illuminate/Contracts/Broadcasting/ShouldBroadcast; 
  10.    class PostSaved extends Event 
  11.  
  12.  
  13.     use SerializesModels; 
  14.        /** 
  15.  
  16.      * Create a new event instance. 
  17.  
  18.      * 
  19.  
  20.      * @return void 
  21.  
  22.      */ 
  23.  
  24.     public function __construct(Post $post
  25.  
  26.     { 
  27.  
  28.         $this->post = $post
  29.  
  30.     } 
  31.        /** 
  32.  
  33.      * Get the channels the event should be broadcast on. 
  34.  
  35.      * 
  36.  
  37.      * @return array 
  38.  
  39.      */ 
  40.  
  41.     public function broadcastOn() 
  42.  
  43.     { 
  44.  
  45.         return []; 
  46.  
  47.     } 
  48.  

我們在構造函數中注入一個Post實例傳遞給PostSaved。

3、定義監聽器類

然后我們來定義監聽器類SaveDataToCache,監聽器類中使用handle方法接收事件實例并執行響應該事件的業務邏輯,這里就是將就接收到的Post實例保存到緩存中:

  1. <?php 
  2.    namespace App/Listeners; 
  3.    use App/Events/PostSaved; 
  4.  
  5. use Cache; 
  6.  
  7. use Log; 
  8.  
  9. use Illuminate/Queue/InteractsWithQueue; 
  10.  
  11. use Illuminate/Contracts/Queue/ShouldQueue; 
  12.    class SaveDataToCache 
  13.  
  14.  
  15.     /** 
  16.  
  17.      * Create the event listener. 
  18.  
  19.      * 
  20.  
  21.      * @return void 
  22.  
  23.      */ 
  24.  
  25.     public function __construct() 
  26.  
  27.     { 
  28.  
  29.         // 
  30.  
  31.     } 
  32.        /** 
  33.  
  34.      * Handle the event. 
  35.  
  36.      * 
  37.  
  38.      * @param PostSaved $event 
  39.  
  40.      * @return void 
  41.  
  42.      */ 
  43.  
  44.     public function handle(PostSaved $event
  45.  
  46.     { 
  47.  
  48.         $post = $event->post; 
  49.  
  50.         $key = 'post_'.$post->id; 
  51.  
  52.         Cache::put($key,$post,60*24*7); 
  53.  
  54.         Log::info('保存文章到緩存成功!',['id'=>$post->id,'title'=>$post->title]); 
  55.  
  56.     } 
  57.  

業務邏輯很簡單:從注入的PostSaved中獲取文章實例并將其保存到緩存,并將該操作記錄到日志。

4、觸發事件

最后我們來測試文章保存事件及其監聽器。

要觸發文章保存事件,可以使用Event門面提供的fire方法,在PostController中修改store方法如下:

  1. public function store(Request $request
  2.  
  3.  
  4.     $title = $request->input('title'); 
  5.  
  6.     $content = $request->input('content'); 
  7.     $post = new Post; 
  8.  
  9.     $post->title = $title
  10.  
  11.     $post->content = $content
  12.  
  13.     $post->save(); 
  14.         Event::fire(new PostSaved($post)); 
  15.         return redirect()->route('post.show',['post'=>$post]); 
  16.  

然后修改update方法如下:

  1. public function update(Request $request, $id) 
  2.  
  3.  
  4.     $post = Post::find($id); 
  5.  
  6.     if(!$post) 
  7.  
  8.         exit('指定文章不存在!'); 
  9.     $title = $request->input('title'); 
  10.  
  11.     $content = $request->input('content'); 
  12.     $post->title = $title; 
  13.  
  14.     $post->content = $content; 
  15.  
  16.     $post->save(); 
  17.         Event::fire(new PostSaved($post)); 
  18.         return redirect()->route('post.show',['post'=>$post]); 
  19.  

在瀏覽器中訪問http://laravel.app:8000/post/create,填寫標題和文章內容:

點擊提交頁面跳轉到文章詳情頁,此時去查看日志storage/logs/laravel.log,可以看到對應日志記錄:

[2015-11-10 23:14:12] local.INFO: 保存文章到緩存成功! {"id":13,"title":"Test Event Add"}

說明已觸發文章保存事件,監聽器監聽到事件后將其保存到緩存中并記錄日志。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台山市| 岳池县| 自贡市| 连州市| 天镇县| 石河子市| 浮梁县| 水城县| 嵊泗县| 小金县| 卫辉市| 志丹县| 孟村| 靖宇县| 洪湖市| 醴陵市| 九江市| 无极县| 汉中市| 中牟县| 龙游县| 松桃| 陆丰市| 封开县| 策勒县| 上杭县| 当雄县| 武邑县| 丽水市| 横峰县| 宝兴县| 白城市| 高清| 寻甸| 紫云| 沂南县| 满城县| 汕尾市| 泸水县| 彰化县| 定边县|