最簡單易懂的laravel事件,這個功能非常的有用

吟漸的小風dee發表於2019-02-16

先說一下在什麼場景會使用這個事件功能。

事情大概是這樣的,需求要在使用者註冊的時候發一些幫助郵件給使用者(原本使用者在註冊之後已經有發別的郵件的了,簡訊,IM什麼的)

原來這個註冊的方法也就10多行程式碼。但是有時候我們為了省事,直接在註冊程式碼後面新增了各種程式碼。

例如這個註冊方法本來是這樣的

<?php
namespace AppHttControllers;

use IlluminateHttpRequest;

class UserController extends Controller
{
    public function register(Request $request)
    {
        //獲取引數
        //驗證引數
        //寫入資料庫
        //return 註冊資訊
        
        
    }
}

現在有一個需求,要求註冊之後給使用者的郵箱發一個廣告,絕大多數的人(也包括以前的我)就直接在這後面接著寫程式碼了

<?php
namespace AppHttControllers;

use IlluminateHttpRequest;

class UserController extends Controller
{
    public function register(Request $request)
    {
        //獲取引數
        //驗證引數
        //寫入資料庫
        
        //傳送廣告郵件
        //return 註冊資訊
        
        
    }
}

這是比較直觀的寫法,後來又有需求要發個簡訊。

<?php
namespace AppHttControllers;

use IlluminateHttpRequest;

class UserController extends Controller
{
    public function register(Request $request)
    {
        //獲取引數
        //驗證引數
        //寫入資料庫
        
        //傳送廣告郵件
        //傳送簡訊
        //return 註冊資訊
        
        
    }
}

然後又有需求,要發IM訊息,這樣的需求很多。這些方法如果你封裝了,可能也就一行程式碼。

但是,在實際專案中,這個註冊方法裡面已經加了很多東西。如果多人開發的話各種不方便。然後想到了laravel似乎有這個功能,但是一直都不知道怎麼應用,仔細看了一下手冊,發現和自己的想法不謀而合。

laravel的事件功能實際上更傾向是一種管理手段,並不是沒了它我們就做不到了,只是它能讓我們做得更加好,更加優雅。

laravel的事件是一種管理+實現的體現,它首先有一個總的目錄,然後我們可以巨集觀的看到所有的事件,而不需要每次都要開啟控制器的方法我們才能知道註冊後會發生什麼,這一點很重要,非常的方便,我就不按著laravel的順序來講,而是按著實際情況來建立這種關係。

現在我們無非就是要在註冊之後要做一系列的事情,首先得註冊完之後呼叫一個事件,然後這個事件再做各種各樣的事

<?php
namespace AppHttControllers;

use IlluminateHttpRequest;
//我們先引入一個事件類,名字自定義的,之後再一步一步建立
use AppEventsRegister;

class UserController extends Controller
{
    public function register(Request $request)
    {
        //獲取引數
        //驗證引數
        //寫入資料庫
        //觸發事件,以後所有需要註冊後要做的事情,都不需要再這裡加程式碼了,我們只需要管理事件就好了
        //event方法是laravel自帶方法, $uid是外部引數,看你需要做什麼,傳什麼引數了。註冊之後肯定有$uid的嘛
        event(new Register($uid));
        //return 註冊資訊
        
        
    }
}

找到appProvidersEventServiceProvider.php檔案。給它新增關係,告訴系統,有人用event()呼叫了事件之後要被誰監聽得到。

<?php

namespace AppProviders;

use LaravelLumenProvidersEventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        // 使用者註冊後的事件
        `AppEventsRegister` => [
            // 傳送廣告郵件
            `AppListenersSendAdMail`,
            // 傳送簡訊
            `AppListenersSendSms`,
            // 傳送幫助資訊
            `AppListenersSendHelpInformation`,

        ],
    ];
}

這裡是註冊事件的入口,相當於一個總目錄,這樣就可以跟註冊程式碼解耦了,以後要加東西我們就不需要再去看註冊方法的程式碼了

現在註冊完之後會觸發這個AppEventsRegister類,然後這個類會被AppListenersSendAdMail,AppListenersSendSmsAppListenersSendHelpInformation監聽得到,我們進入appEvents目錄,建立Register這個類

<?php

namespace AppEvents;

class Register
{

    public $uid;

    /**
     * 建立一個新的事件例項.
     *
     * @param  Order  $order
     * @return void
     */
    public function __construct($uid)
    {
        $this->uid = $uid;
    }
}

這樣就可以了。

然後去appListeners目錄建立各種要做的事件監聽類。

<?php

namespace AppListeners;

use AppEventsRegister;
use AppModelsUser;
use IlluminateContractsQueueShouldQueue;

class SendHelpInformation implements ShouldQueue
{
    
    
    public function __construct()
    {
        //
    }

   
    public function handle(Register $event)
    {
        $uid = $event->uid;
        
        $user = User::find($uid);
        
        //......各種實現
    }
}

這個handle方法就是我們要做的具體實現了,有個很方便的功能就是如果implements ShouldQueue這個介面的話就會非同步佇列執行,如果去掉的話就是同步執行。很方便有沒有,這樣程式碼就解耦了,不需要再管註冊程式碼了,在這裡就能很方便的管理了。多人開發也是單獨寫自己的Listeners就可以了。

具體的建議大家去看看手冊吧,有些內容我這裡就不完全說了。我只是拋磚引玉

相關文章