簡單易懂的laravel事件,這個功能非常的有用(監聽事件,訂閱者模式)


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

事情大概是這樣的,需求要在用戶注冊的時候發一些幫助郵件給用戶(原本用戶在注冊之后已經有發別的郵件的了,短信,IM什么的)

原來這個注冊的方法也就10多行代碼。但是有時候我們為了省事,直接在注冊代碼后面添加了各種代碼。

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

<?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 注冊信息
        
        
    }
}

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

<?php
namespace App\Htt\Controllers;

use Illuminate\Http\Request;

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

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

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

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

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

現在我們無非就是要在注冊之后要做一系列的事情,首先得注冊完之后調用一個事件,然后這個事件再做各種各樣的事

<?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就可以了。

 

 

轉: https://segmentfault.com/a/1190000010730545

設計模式的閱讀:  https://www.cnblogs.com/fps2tao/p/9640338.html

關聯閱讀: https://www.cnblogs.com/fps2tao/p/9681317.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM