分享個(gè)簡(jiǎn)單易懂且非常有用的laravel事件
前言
在開(kāi)始本文的正文之前,我們先說(shuō)一下在什么場(chǎng)景會(huì)使用這個(gè)事件功能。
事情大概是這樣的,需求要在用戶注冊(cè)的時(shí)候發(fā)一些幫助郵件給用戶(原本用戶在注冊(cè)之后已經(jīng)有發(fā)別的郵件的了,短信,IM什么的)
原來(lái)這個(gè)注冊(cè)的方法也就10多行代碼。但是有時(shí)候我們?yōu)榱耸∈?,直接在注?cè)代碼后面添加了各種代碼。
例如這個(gè)注冊(cè)方法本來(lái)是這樣的
<?php namespace App\Htt\Controllers; use Illuminate\Http\Request; class UserController extends Controller { public function register(Request $request) { //獲取參數(shù) //驗(yàn)證參數(shù) //寫(xiě)入數(shù)據(jù)庫(kù) //return 注冊(cè)信息 } }
現(xiàn)在有一個(gè)需求,要求注冊(cè)之后給用戶的郵箱發(fā)一個(gè)廣告,絕大多數(shù)的人(也包括以前的我)就直接在這后面接著寫(xiě)代碼了
<?php namespace App\Htt\Controllers; use Illuminate\Http\Request; class UserController extends Controller { public function register(Request $request) { //獲取參數(shù) //驗(yàn)證參數(shù) //寫(xiě)入數(shù)據(jù)庫(kù) //發(fā)送廣告郵件 //return 注冊(cè)信息 } }
這是比較直觀的寫(xiě)法,后來(lái)又有需求要發(fā)個(gè)短信。
<?php namespace App\Htt\Controllers; use Illuminate\Http\Request; class UserController extends Controller { public function register(Request $request) { //獲取參數(shù) //驗(yàn)證參數(shù) //寫(xiě)入數(shù)據(jù)庫(kù) //發(fā)送廣告郵件 //發(fā)送短信 //return 注冊(cè)信息 } }
然后又有需求,要發(fā)IM消息,這樣的需求很多。這些方法如果你封裝了,可能也就一行代碼。
但是,在實(shí)際項(xiàng)目中,這個(gè)注冊(cè)方法里面已經(jīng)加了很多東西。如果多人開(kāi)發(fā)的話各種不方便。然后想到了laravel似乎有這個(gè)功能,但是一直都不知道怎么應(yīng)用,仔細(xì)看了一下手冊(cè),發(fā)現(xiàn)和自己的想法不謀而合。
laravel的事件功能實(shí)際上更傾向是一種管理手段,并不是沒(méi)了它我們就做不到了,只是它能讓我們做得更加好,更加優(yōu)雅。
laravel的事件是一種管理+實(shí)現(xiàn)的體現(xiàn),它首先有一個(gè)總的目錄,然后我們可以宏觀的看到所有的事件,而不需要每次都要打開(kāi)控制器的方法我們才能知道注冊(cè)后會(huì)發(fā)生什么,這一點(diǎn)很重要,非常的方便,我就不按著laravel的順序來(lái)講,而是按著實(shí)際情況來(lái)建立這種關(guān)系。
現(xiàn)在我們無(wú)非就是要在注冊(cè)之后要做一系列的事情,首先得注冊(cè)完之后調(diào)用一個(gè)事件,然后這個(gè)事件再做各種各樣的事
<?php namespace App\Htt\Controllers; use Illuminate\Http\Request; //我們先引入一個(gè)事件類,名字自定義的,之后再一步一步創(chuàng)建 use App\Events\Register; class UserController extends Controller { public function register(Request $request) { //獲取參數(shù) //驗(yàn)證參數(shù) //寫(xiě)入數(shù)據(jù)庫(kù) //觸發(fā)事件,以后所有需要注冊(cè)后要做的事情,都不需要再這里加代碼了,我們只需要管理事件就好了 //event方法是laravel自帶方法, $uid是外部參數(shù),看你需要做什么,傳什么參數(shù)了。注冊(cè)之后肯定有$uid的嘛 event(new Register($uid)); //return 注冊(cè)信息 } }
找到\app\Providers\EventServiceProvider.php文件。給它添加關(guān)系,告訴系統(tǒng),有人用event()
調(diào)用了事件之后要被誰(shuí)監(jiān)聽(tīng)得到。
<?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 = [ // 用戶注冊(cè)后的事件 'App\Events\Register' => [ // 發(fā)送廣告郵件 'App\Listeners\SendAdMail', // 發(fā)送短信 'App\Listeners\SendSms', // 發(fā)送幫助信息 'App\Listeners\SendHelpInformation', ], ]; }
這里是注冊(cè)事件的入口,相當(dāng)于一個(gè)總目錄,這樣就可以跟注冊(cè)代碼解耦了,以后要加?xùn)|西我們就不需要再去看注冊(cè)方法的代碼了
現(xiàn)在注冊(cè)完之后會(huì)觸發(fā)這個(gè)App\Events\Register類,然后這個(gè)類會(huì)被App\Listeners\SendAdMail,App\Listeners\SendSms,App\Listeners\SendHelpInformation監(jiān)聽(tīng)得到,我們進(jìn)入app\Events目錄,創(chuàng)建Register這個(gè)類
<?php namespace App\Events; class Register { public $uid; /** * 創(chuàng)建一個(gè)新的事件實(shí)例. * * @param Order $order * @return void */ public function __construct($uid) { $this->uid = $uid; } }
這樣就可以了。
然后去app\Listeners目錄創(chuàng)建各種要做的事件監(jiān)聽(tīng)類。
<?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); //......各種實(shí)現(xiàn) } }
這個(gè)handle方法就是我們要做的具體實(shí)現(xiàn)了,有個(gè)很方便的功能就是如果implements ShouldQueue這個(gè)接口的話就會(huì)異步隊(duì)列執(zhí)行,如果去掉的話就是同步執(zhí)行。很方便有沒(méi)有,這樣代碼就解耦了,不需要再管注冊(cè)代碼了,在這里就能很方便的管理了。多人開(kāi)發(fā)也是單獨(dú)寫(xiě)自己的Listeners就可以了。
具體的建議大家去看看手冊(cè)吧,有些內(nèi)容我這里就不完全說(shuō)了。我只是拋磚引玉
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
ThinkPHP控制器間實(shí)現(xiàn)相互調(diào)用的方法
這篇文章主要介紹了ThinkPHP控制器間實(shí)現(xiàn)相互調(diào)用的方法,主要通過(guò)A()方法實(shí)現(xiàn)這一功能,可以有效的提高代碼的重復(fù)利用率,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10laravel 操作數(shù)據(jù)庫(kù)常用函數(shù)的返回值方法
今天小編就為大家分享一篇laravel 操作數(shù)據(jù)庫(kù)常用函數(shù)的返回值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10thinkphp5+layui實(shí)現(xiàn)的分頁(yè)樣式示例
這篇文章主要介紹了thinkphp5+layui實(shí)現(xiàn)的分頁(yè)樣式,結(jié)合實(shí)例形式詳細(xì)分析了thinkPHP5框架結(jié)合layui實(shí)現(xiàn)的分頁(yè)功能相關(guān)的配置、查詢等操作技巧,需要的朋友可以參考下2019-10-10ThinkPHP表單自動(dòng)驗(yàn)證實(shí)例
這篇文章主要介紹了ThinkPHP表單自動(dòng)驗(yàn)證實(shí)例,是ThinkPHP三大自動(dòng)中非常常用的一個(gè)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10php上傳文件,創(chuàng)建遞歸目錄的實(shí)例代碼
這篇文章介紹了php上傳文件,創(chuàng)建遞歸目錄的實(shí)例代碼,有需要的朋友可以參考一下2013-10-10Yii2.0使用阿里云OSS的SDK上傳圖片、下載、刪除圖片示例
本篇文章主要介紹了Yii2.0使用阿里云OSS的SDK上傳圖片、下載、刪除圖片示例,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09PHP實(shí)現(xiàn)的帶超時(shí)功能get_headers函數(shù)
這篇文章主要介紹了PHP實(shí)現(xiàn)的帶超時(shí)功能的get_headers函數(shù),本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-02-02