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

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

事情大概是這樣的,需求要在用戶註冊的時候發一些幫助郵件給用戶(本來用戶在註冊以後已經有發別的郵件的了,短信,IM什麼的)laravel

原來這個註冊的方法也就10多行代碼。可是有時候咱們爲了省事,直接在註冊代碼後面添加了各類代碼。數據庫

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

<?php
namespace App\Htt\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function register(Request $request)
    {
        //獲取參數
        //驗證參數
        //寫入數據庫
        //return 註冊信息
        
        
    }
}

如今有一個需求,要求註冊以後給用戶的郵箱發一個廣告,絕大多數的人(也包括之前的我)就直接在這後面接着寫代碼了異步

<?php
namespace App\Htt\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function register(Request $request)
    {
        //獲取參數
        //驗證參數
        //寫入數據庫
        
        //發送廣告郵件
        //return 註冊信息
        
        
    }
}

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

<?php
namespace App\Htt\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function register(Request $request)
    {
        //獲取參數
        //驗證參數
        //寫入數據庫
        
        //發送廣告郵件
        //發送短信
        //return 註冊信息
        
        
    }
}

而後又有需求,要發IM消息,這樣的需求不少。這些方法若是你封裝了,可能也就一行代碼。ui

可是,在實際項目中,這個註冊方法裏面已經加了不少東西。若是多人開發的話各類不方便。而後想到了laravel彷佛有這個功能,可是一直都不知道怎麼應用,仔細看了一下手冊,發現和本身的想法不謀而合。this

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

laravel的事件是一種管理+實現的體現,它首先有一個總的目錄,而後咱們能夠宏觀的看到全部的事件,而不須要每次都要打開控制器的方法咱們才能知道註冊後會發生什麼,這一點很重要,很是的方便,我就不按着laravel的順序來說,而是按着實際狀況來創建這種關係。code

如今咱們無非就是要在註冊以後要作一系列的事情,首先得註冊完以後調用一個事件,而後這個事件再作各類各樣的事

<?php
namespace App\Htt\Controllers;

use Illuminate\Http\Request;
//咱們先引入一個事件類,名字自定義的,以後再一步一步建立
use App\Events\Register;

class UserController extends Controller
{
    public function register(Request $request)
    {
        //獲取參數
        //驗證參數
        //寫入數據庫
        //觸發事件,之後全部須要註冊後要作的事情,都不須要再這裏加代碼了,咱們只須要管理事件就行了
        //event方法是laravel自帶方法, $uid是外部參數,看你須要作什麼,傳什麼參數了。註冊以後確定有$uid的嘛
        event(new Register($uid));
        //return 註冊信息
        
        
    }
}

找到\app\Providers\EventServiceProvider.php文件。給它添加關係,告訴系統,有人用event()調用了事件以後要被誰監聽獲得。

<?php

namespace App\Providers;

use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        // 用戶註冊後的事件
        'App\Events\Register' => [
            // 發送廣告郵件
            'App\Listeners\SendAdMail',
            // 發送短信
            'App\Listeners\SendSms',
            // 發送幫助信息
            'App\Listeners\SendHelpInformation',

        ],
    ];
}

這裏是註冊事件的入口,至關於一個總目錄,這樣就能夠跟註冊代碼解耦了,之後要加東西咱們就不須要再去看註冊方法的代碼了

如今註冊完以後會觸發這個App\Events\Register類,而後這個類會被App\Listeners\SendAdMail,App\Listeners\SendSmsApp\Listeners\SendHelpInformation監聽獲得,咱們進入app\Events目錄,建立Register這個類

<?php

namespace App\Events;

class Register
{

    public $uid;

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

這樣就能夠了。

而後去app\Listeners目錄建立各類要作的事件監聽類。

<?php

namespace App\Listeners;

use App\Events\Register;
use App\Models\User;
use Illuminate\Contracts\Queue\ShouldQueue;

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

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

這個handle方法就是咱們要作的具體實現了,有個很方便的功能就是若是implements ShouldQueue這個接口的話就會異步隊列執行,若是去掉的話就是同步執行。很方便有沒有,這樣代碼就解耦了,不須要再管註冊代碼了,在這裏就能很方便的管理了。多人開發也是單獨寫本身的Listeners就能夠了。

具體的建議你們去看看手冊吧,有些內容我這裏就不徹底說了。我只是拋磚引玉

相關文章
相關標籤/搜索