1. 程式人生 > >Laravel 5.1 定義事件、事件監聽器以及觸發事件例項教程

Laravel 5.1 定義事件、事件監聽器以及觸發事件例項教程

今天我們開始講Laravel的事件,事件無處不在,比如使用者登入、購買商品、搜尋、檢視文章,等等,都是事件,有了事件,就有事件監聽器,事件監聽器監聽到事件發生後會執行一些操作,Laravel使用觀察者模式來實現這種監聽機制。本節我們通過一個簡單的示例來講述在Laravel中如何建立事件類、事件對應的監聽器類,以及監聽器如何監聽事件發生並執行相應操作。

這裡我們基於之前基於模型+快取對文章增刪改查這篇檔案對文章儲存後快取的處理做進一步優化。我們將文章儲存(新建/修改)視為一個事件,將儲存文章內容到快取放到監聽器中實現:
1、註冊事件-監聽器

首先我們需要在EventServiceProvider中註冊事件與監聽器之間的對映關係:

protected $listen = [
    'App\Events\PostSaved'=>[
        'App\Listeners\SaveDataToCache'
    ]
];

然後我們在專案根目錄執行如下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,填寫標題和文章內容:

Laravel測試文章儲存事件

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

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

說明已觸發文章儲存事件,監聽器監聽到事件後將其儲存到快取中並記錄日誌。

文章修改也是一樣操作,這裡不再贅述。

轉載:http://laravelacademy.org/post/1889.html

相關推薦

Laravel 5.1 定義事件事件監聽器以及觸發事件例項教程

今天我們開始講Laravel的事件,事件無處不在,比如使用者登入、購買商品、搜尋、檢視文章,等等,都是事件,有了事件,就有事件監聽器,事件監聽器監聽到事件發生後會執行一些操作,Laravel使用觀察者模式來實現這種監聽機制。本節我們通過一個簡單的示例來講述在Laravel中

單選按鈕觸發事件下拉列表觸發事件

else if 選擇 nan int 處理 n) drop 一個 androi OnCheckedChangeListener(處理用戶在選中單選按鈕的選項時觸發)     RadioGroup rg = ( RadioGroup) findById(new OnCheck

Laravel 5.1 中的異常處理器和HTTP異常處理 abort()

錯誤日誌 exce ant upload 記錄 再次 .org splay don 原文 http://laravelacademy.org/post/1867.html 錯誤和異常是處理程序開發中不可回避的議題,在本地開發中我們往往希望能捕獲程序拋出的異常並將其顯示打印

jQuery.1.9 live 代替事件 on 新增內容無法觸發事件

class status jquer earch pen cnblogs span == nbsp 如果是新增 append 或者 html() 事件添加的內容,無法觸發 click 事件, 在1.9 可以用live 事件來代替 1.9以後用 <div class

laravel 5.1 Eloquent常見問題

自增 ble sta light true log ins 常見 class 1、新增一條記錄以及判斷是否新增成功 $instance = XxxModel::create([‘a‘ => 1, ‘b‘ => 2]); if ($instance[‘id‘])

laravel 5定義全局函數,怎麽弄呢?

bsp psr-4 log ide r.js 增加 function apps fun 在app/Helpers/(目錄可以自己隨便來) 下新建一個文件 functions.php 在functions.php 中加入這個方法 然後在 bootstrap/autoload

Laravel 5.1的多路由檔案的配置

Laravel 5.1的多路由檔案的配置   預設的路由配置檔案只有一個,\app\Http\routes.php。在同一個檔案中寫路由容易起衝突,檔案會越來越大,就需要定義多個路由檔案。找到載入\app\Http\routes.php的檔案,開啟\app\Providers\RouteSe

Laravel 5.1 報錯:[AppHttpRequestsRequest] is not instantiable

like php 報錯 sts http 路徑 bin requests lin Laravel 5.1 報錯:[App\Http\Requests\Request] is not instantiable 錯誤提示: Whoops, looks like some

Laravel 5.1的多路由文件的配置

容易 多個 需要 bsp 多路由 加載 文件的 route providers Laravel 5.1的多路由文件的配置 默認的路由配置文件只有一個,\app\Http\routes.php。在同一個文件中寫路由容易起沖突,文件會越來越大,就需要定義多個路由文件。找到

Laravel 5.1 框架返回狀態攔截

Laravel 5.1 返回資訊狀態攔截   可以在app\Exceptions\Handler.php檔案中修改, public function render($request, Exception $e) { return parent::render($reques

solidity學習筆記(10)—— 事件日誌與互動(含例項

事件是以太坊EVM提供的一種日誌基礎設施。事件可以用來做操作記錄,儲存為日誌。也可以用來實現一些互動功能,比如通知UI,返回函式呼叫結果等。 總的來說:事件就是當區塊鏈某個函式被呼叫或執行的時候,被觸發從而被前端獲取或者記錄到日誌中的物件。 一、事件的實現 事件的實現是

laravel 5.1 目錄結構

開始接觸laravel了  看了下官方文件,記錄哈它的目錄結構。 預設的 Laravel 應用程式結構意在給不同大小的應用程式提供一個好的起始點。當然,你也可以依照個人喜好來隨意組織應用程式。Laravel 幾乎沒有對任何類的放置位置進行強加限制 - 只要 Composer 可以自動載

jQuery的屬性css文件處理事件選擇器以及jsp要點簡記

本文繼續紀錄學習jQuery,主要學習jQuery的屬性、css、文件處理、事件、選擇器,最後簡要記錄jsp知識要點。 1.JQ屬性: attr(name|pro|key,val|fn):設定或返回被

MySQL 5.1 忘記密碼修改密碼 (Window版本)

MySQL 作為一款經典的資料庫軟體深受廣大學生、站長、企業的喜愛資料庫產品,但是有時候由於長時間不進行操作忘記密碼,或者密碼存放丟失忘記密碼,或者密碼太複雜大致忘記密碼,下面就告訴大家如何在忘記密碼的情況下修改 MySQL 密碼。 以下是MySQL 5.1 的軟體安裝包下載地址和MySQL安裝圖文教

js中常用的事件,onclick 單擊事件onblur 失去焦點事件onchange改變事件onmouseover滑鼠進入事件onmouseout滑鼠移除事件onsubmit提交事件

onclick 單擊事件 onblur 失去焦點事件 onchange 當物件或選中區的內容改變時觸發。 onmouseover 當用戶將滑鼠指標移動到物件內時觸發。 onmouseout 當用戶將滑鼠指標移出物件邊界時觸發。 onsubmit 當表單將要被提交時觸發。

RecyclerView展示固定資料上拉載入更多下拉重新整理點選事件長按點選事件刪除條目重新整理條目新增條目多條目載入

1、依賴:    implementation 'com.android.support:recyclerview-v7:27.0.2' 2、activity_main、 <?xml version="1.0" encoding="utf-8"?> <Li

終於成功的做到了相容IEFFgoogle的回車鍵觸發事件(js原始碼)

<script language="javascript" type="text/javascript" src="../Script/jquery-1.4.2.js"></script> <script language="javascrip

Laravel 5.1之Ajax無重新整理分頁

ajax無重新整理分頁的優點: 1、區域性重新整理 減輕壓力 2、美觀 提高使用者體驗 php程式碼: /* @Laravel框架 @Ajax無重新整理分頁(簡單7步驟) */ public fu

判斷滾動事件由下到上觸發事件(偽)

window 判斷 var ons log posit ans win style .chan-top{top: 416px;} <div class="ans-box chan-top" style="height: 312px; position: fixed;l

JavaScript禁止沒有回車事件的input觸發submit提交表單事件,已有回車觸發事件的input不受影響

<script type="text/javascript"> document.onkeydown = function(event) {//禁止沒有回車事件的input觸發s