先說一下在什麼場景會使用這個事件功能。
事情大概是這樣的,需求要在用戶註冊的時候發一些幫助郵件給用戶(原本用戶在註冊之後已經有發別的郵件的了,短信,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\SendSms
,App\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就可以了。
具體的建議大家去看看手冊吧,有些內容我這裏就不完全說了。我只是拋磚引玉