分享個簡單易懂且非常有用的laravel事件
前言
在開始本文的正文之前,我們先說一下在什么場景會使用這個事件功能。
事情大概是這樣的,需求要在用戶注冊的時候發(fā)一些幫助郵件給用戶(原本用戶在注冊之后已經(jīng)有發(fā)別的郵件的了,短信,IM什么的)
原來這個注冊的方法也就10多行代碼。但是有時候我們?yōu)榱耸∈拢苯釉谧源a后面添加了各種代碼。
例如這個注冊方法本來是這樣的
<?php
namespace App\Htt\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function register(Request $request)
{
//獲取參數(shù)
//驗證參數(shù)
//寫入數(shù)據(jù)庫
//return 注冊信息
}
}
現(xiàn)在有一個需求,要求注冊之后給用戶的郵箱發(fā)一個廣告,絕大多數(shù)的人(也包括以前的我)就直接在這后面接著寫代碼了
<?php
namespace App\Htt\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function register(Request $request)
{
//獲取參數(shù)
//驗證參數(shù)
//寫入數(shù)據(jù)庫
//發(fā)送廣告郵件
//return 注冊信息
}
}
這是比較直觀的寫法,后來又有需求要發(fā)個短信。
<?php
namespace App\Htt\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function register(Request $request)
{
//獲取參數(shù)
//驗證參數(shù)
//寫入數(shù)據(jù)庫
//發(fā)送廣告郵件
//發(fā)送短信
//return 注冊信息
}
}
然后又有需求,要發(fā)IM消息,這樣的需求很多。這些方法如果你封裝了,可能也就一行代碼。
但是,在實際項目中,這個注冊方法里面已經(jīng)加了很多東西。如果多人開發(fā)的話各種不方便。然后想到了laravel似乎有這個功能,但是一直都不知道怎么應(yīng)用,仔細(xì)看了一下手冊,發(fā)現(xiàn)和自己的想法不謀而合。
laravel的事件功能實際上更傾向是一種管理手段,并不是沒了它我們就做不到了,只是它能讓我們做得更加好,更加優(yōu)雅。
laravel的事件是一種管理+實現(xiàn)的體現(xiàn),它首先有一個總的目錄,然后我們可以宏觀的看到所有的事件,而不需要每次都要打開控制器的方法我們才能知道注冊后會發(fā)生什么,這一點很重要,非常的方便,我就不按著laravel的順序來講,而是按著實際情況來建立這種關(guān)系。
現(xiàn)在我們無非就是要在注冊之后要做一系列的事情,首先得注冊完之后調(diào)用一個事件,然后這個事件再做各種各樣的事
<?php
namespace App\Htt\Controllers;
use Illuminate\Http\Request;
//我們先引入一個事件類,名字自定義的,之后再一步一步創(chuàng)建
use App\Events\Register;
class UserController extends Controller
{
public function register(Request $request)
{
//獲取參數(shù)
//驗證參數(shù)
//寫入數(shù)據(jù)庫
//觸發(fā)事件,以后所有需要注冊后要做的事情,都不需要再這里加代碼了,我們只需要管理事件就好了
//event方法是laravel自帶方法, $uid是外部參數(shù),看你需要做什么,傳什么參數(shù)了。注冊之后肯定有$uid的嘛
event(new Register($uid));
//return 注冊信息
}
}
找到\app\Providers\EventServiceProvider.php文件。給它添加關(guān)系,告訴系統(tǒng),有人用event()調(diào)用了事件之后要被誰監(jiān)聽得到。
<?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' => [
// 發(fā)送廣告郵件
'App\Listeners\SendAdMail',
// 發(fā)送短信
'App\Listeners\SendSms',
// 發(fā)送幫助信息
'App\Listeners\SendHelpInformation',
],
];
}
這里是注冊事件的入口,相當(dāng)于一個總目錄,這樣就可以跟注冊代碼解耦了,以后要加?xùn)|西我們就不需要再去看注冊方法的代碼了
現(xiàn)在注冊完之后會觸發(fā)這個App\Events\Register類,然后這個類會被App\Listeners\SendAdMail,App\Listeners\SendSms,App\Listeners\SendHelpInformation監(jiān)聽得到,我們進(jìn)入app\Events目錄,創(chuàng)建Register這個類
<?php
namespace App\Events;
class Register
{
public $uid;
/**
* 創(chuàng)建一個新的事件實例.
*
* @param Order $order
* @return void
*/
public function __construct($uid)
{
$this->uid = $uid;
}
}
這樣就可以了。
然后去app\Listeners目錄創(chuàng)建各種要做的事件監(jiān)聽類。
<?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);
//......各種實現(xiàn)
}
}
這個handle方法就是我們要做的具體實現(xiàn)了,有個很方便的功能就是如果implements ShouldQueue這個接口的話就會異步隊列執(zhí)行,如果去掉的話就是同步執(zhí)行。很方便有沒有,這樣代碼就解耦了,不需要再管注冊代碼了,在這里就能很方便的管理了。多人開發(fā)也是單獨寫自己的Listeners就可以了。
具體的建議大家去看看手冊吧,有些內(nèi)容我這里就不完全說了。我只是拋磚引玉
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
thinkphp3.2.2實現(xiàn)生成多張縮略圖的方法
這篇文章主要介紹了thinkphp3.2.2實現(xiàn)生成多張縮略圖的方法,通過調(diào)用ThinkPHP擴(kuò)展包的UploadFile類實現(xiàn)針對上傳圖片的縮略圖處理,非常具有實用價值,需要的朋友可以參考下2014-12-12
利用php+mysql來做一個功能強(qiáng)大的在線計算器
有天在努力的搜索計算器,發(fā)現(xiàn)都是JavaScript,而且要一個個地點擊,并且不能記錄,輸入計算式子時容易出錯,于是就想了想該怎樣才能讓它好用點呢,能夠用鍵盤直接輸入。2010-10-10
PHP的openssl加密擴(kuò)展使用小結(jié)(推薦)
下面小編就為大家?guī)硪黄狿HP的openssl加密擴(kuò)展使用小結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-07-07
php使用event擴(kuò)展的io復(fù)用測試的示例
這篇文章主要介紹了php使用event擴(kuò)展的io復(fù)用測試的示例,幫助大家更好的理解和使用php,感興趣的朋友可以了解下2020-10-10

