Observer觀察者模式模型事件實(shí)戰(zhàn)

laravel的orm特別好用,特別是observer觀察者模式,可以在不更改原有業(yè)務(wù)代碼的情況下做到切入編程,有點(diǎn)類似于我們之前常用的鉤子函數(shù)。

下面就是我們深入observer觀察者模式的實(shí)戰(zhàn)代碼

現(xiàn)有一個(gè)業(yè)務(wù)邏輯是姚淆,我們的會(huì)員系統(tǒng)有一個(gè)經(jīng)驗(yàn)值,當(dāng)某個(gè)經(jīng)驗(yàn)值達(dá)到某個(gè)臨界點(diǎn)的時(shí)候我們就給這個(gè)會(huì)員升級(jí)權(quán)限屡律。

但是獲取這個(gè)經(jīng)驗(yàn)值的渠道有很多腌逢,意思就是我們的獲取經(jīng)驗(yàn)值的代碼可能存在多個(gè)地方,如果要去改動(dòng)代碼的話需要找到每個(gè)代碼文件一一的更改代碼超埋。

有沒(méi)有一種在不改動(dòng)之前的業(yè)務(wù)代碼下的只需要增加一個(gè)判斷就能做到經(jīng)驗(yàn)值達(dá)到>升級(jí)這步操作呢搏讶?

當(dāng)然有,就是laravel的observer觀察者模式纳本。

看看實(shí)戰(zhàn)代碼

<?php
namespace App\Observers\Member;
use App\Model\Member\MemberModel;

class MemberObserver
{
    public function saving(MemberModel $model)
    {
        //如果面經(jīng)值大于1000 或者mvp大于10   并且是普通會(huì)員
        if (($model->exp_interview >= 1000 || $model->exp_mvp >= 10) and $model->role_interview == 0) {
            $model->role_interview = 1;
        }
        if (isset($model['exp_interview']) and isset($model['exp_shen'])) {
            $model['exp_interview'] = $model['exp_interview'] >= 0 ? $model['exp_interview'] : 0;
            $model['exp_shen']      = $model['exp_shen'] >= 0 ? $model['exp_shen'] : 0;
        }
        return $model;
    }

    public function created(MemberModel $model)
    {
        //新用戶注冊(cè)
        if ($model->pid !== 0) {
            $member = MemberModel::query()->select('id', 'name')->find($model->pid);
            if (isset($member)) {
                $count             = MemberModel::query()->where('pid', $model->pid)->count();
                $member->sub_count = $count;
                $member->save();
            }
        }
    }
}

這里我們新建了一個(gè)MemberObserver類窍蓝,主要就是我們的業(yè)務(wù)邏輯

方法saving就是當(dāng)MemberModel 就是我們的會(huì)員表發(fā)生正在保存中的事件時(shí),當(dāng)經(jīng)驗(yàn)值大于多少繁成,就把我們的權(quán)限升級(jí)為某個(gè)等級(jí)吓笙。

方法created意思為當(dāng)MemberModel模型發(fā)生insert插入成功后觸發(fā)的事件,插入成功肯定就是我們的會(huì)員注冊(cè)成功了巾腕,給邀請(qǐng)人發(fā)放獎(jiǎng)勵(lì)之類的邏輯就可以寫(xiě)在這里面睛。

現(xiàn)在我們的觀察者定義好了,就要讓我們的觀察者正常工作尊搬。

來(lái)到\app\Providers目錄下找到AppServiceProvider.php文件

在boot方法中注冊(cè)一下我們的MemberObserver

 public function boot()
    {
        MemberModel::observe(MemberObserver::class);
    }

至此我們的觀察者就注冊(cè)好了叁鉴,這里的意思就是讓MemberObserver去觀察MemberModel模型

觀察者中還可以定義其他的一些事件,這些都是laravel為我們定義好了的

retrieved

creating

created

updating

updated

saving

saved

deleting

deleted

restoring

restored

具體的事件類型可以去查詢一下laravel的官方文檔

再讓我們看看為什么我們能監(jiān)聽(tīng)到模型的事件佛寿,查看一下laravel的源代碼

找到模型基類 \vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php

以save方法為例

/**
 * Save the model to the database.
 *
 * @param  array  $options
 * @return bool
 */
public function save(array $options = [])
{
    $query = $this->newModelQuery();

    // If the "saving" event returns false we'll bail out of the save and return
    // false, indicating that the save failed. This provides a chance for any
    // listeners to cancel save operations if validations fail or whatever.
    if ($this->fireModelEvent('saving') === false) {
        return false;
    }

    // If the model already exists in the database we can just update our record
    // that is already in this database using the current IDs in this "where"
    // clause to only update this model. Otherwise, we'll just insert them.
    if ($this->exists) {
        $saved = $this->isDirty() ?
                    $this->performUpdate($query) : true;
    }

    // If the model is brand new, we'll insert it into our database and set the
    // ID attribute on the model to the value of the newly inserted row's ID
    // which is typically an auto-increment value managed by the database.
    else {
        $saved = $this->performInsert($query);

        if (! $this->getConnectionName() &&
            $connection = $query->getConnection()) {
            $this->setConnection($connection->getName());
        }
    }

    // If the model is successfully saved, we need to do a few more things once
    // that is done. We will call the "saved" method here to run any actions
    // we need to happen after a model gets successfully saved right here.
    if ($saved) {
        $this->finishSave($options);
    }

    return $saved;
}

在save方法中我們看到有一個(gè)

    if ($this->fireModelEvent('saving') === false) {
        return false;
    }

這里就是去觸發(fā)我們的saving方法幌墓,

不得不感嘆laravel的orm真的是非常的好用,確實(shí)加入了很多現(xiàn)代編程的規(guī)范和一些奇思妙想的方法冀泻。常侣。

版權(quán)聲明:本文由何煩過(guò)虎溪發(fā)布,如需轉(zhuǎn)載請(qǐng)注明出處弹渔。
轉(zhuǎn)載請(qǐng)注明出處:http://www.95shouyou.com/?id=27

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胳施,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肢专,更是在濱河造成了極大的恐慌舞肆,老刑警劉巖焦辅,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異椿胯,居然都是意外死亡筷登,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)压状,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仆抵,“玉大人跟继,你說(shuō)我怎么就攤上這事种冬。” “怎么了舔糖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵娱两,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我金吗,道長(zhǎng)十兢,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任摇庙,我火速辦了婚禮旱物,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卫袒。我一直安慰自己宵呛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布夕凝。 她就那樣靜靜地躺著宝穗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪码秉。 梳的紋絲不亂的頭發(fā)上逮矛,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音转砖,去河邊找鬼须鼎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛府蔗,可吹牛的內(nèi)容都是我干的晋控。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼礁竞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糖荒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起模捂,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捶朵,失蹤者是張志新(化名)和其女友劉穎蜘矢,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體综看,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡品腹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了红碑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舞吭。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖析珊,靈堂內(nèi)的尸體忽然破棺而出羡鸥,到底是詐尸還是另有隱情,我是刑警寧澤忠寻,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布惧浴,位于F島的核電站,受9級(jí)特大地震影響奕剃,放射性物質(zhì)發(fā)生泄漏衷旅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一纵朋、第九天 我趴在偏房一處隱蔽的房頂上張望柿顶。 院中可真熱鬧,春花似錦操软、人聲如沸嘁锯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)猪钮。三九已至,卻和暖如春胆建,著一層夾襖步出監(jiān)牢的瞬間烤低,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工笆载, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扑馁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓凉驻,卻偏偏與公主長(zhǎng)得像腻要,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涝登,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容