成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Yii2開(kāi)發(fā)技巧 使用類(lèi)似閉包的方式封裝事務(wù)

shevy / 1036人閱讀

摘要:第二沒(méi)有記錄日志的行為,即使出了問(wèn)題也不容易排除。異常錯(cuò)誤然后回到如何傳參的問(wèn)題,我們可以使用閉包,貼一段偽代碼,如下執(zhí)行事務(wù)業(yè)務(wù)代碼大功告成,代碼看起來(lái)有沒(méi)有更好看呢如有問(wèn)題,歡迎指教。

在控制器中執(zhí)行事務(wù)的時(shí)候,一般的代碼如下:

$transaction = Yii::$app->db->beginTransaction();
try {
    //一些業(yè)務(wù)代碼
    $transaction->commit();
} catch (Exception $e) {
    $transaction->rollBack();
    throw $e;
}

于是我在想,這個(gè)代碼結(jié)構(gòu),只有//一些業(yè)務(wù)代碼 這一部分是不一樣,卻要重復(fù)很多遍,這一不是很冗余嗎? 而且 不!好!看!,于是我試著尋找解決方法,一開(kāi)始在stackflow找到一個(gè)類(lèi)似的提問(wèn),有方案是在model里做封裝,但是這樣做有一定問(wèn)題,如產(chǎn)生嵌套事務(wù)等,有興趣的可以點(diǎn)擊這里查看該問(wèn)答。

我們的Yii框架給出了一個(gè)方法transaction,乍一看好像不能解決傳參的問(wèn)題,我們先不管,往下看,該方法調(diào)用方式如下:

Yii::$app->db->transaction(function() {
    //一些業(yè)務(wù)代碼
});

我們來(lái)看一下這個(gè)方法的源碼

/**
 * Executes callback provided in a transaction.
 *
 * @param callable $callback a valid PHP callback that performs the job. Accepts connection instance as parameter.
 * @param string|null $isolationLevel The isolation level to use for this transaction.
 * See [[Transaction::begin()]] for details.
 * @throws Exception|Throwable if there is any exception during query. In this case the transaction will be rolled back.
 * @return mixed result of callback function
 */
public function transaction(callable $callback, $isolationLevel = null)
{
    $transaction = $this->beginTransaction($isolationLevel);
    $level = $transaction->level;

    try {
        $result = call_user_func($callback, $this);
        if ($transaction->isActive && $transaction->level === $level) {
            $transaction->commit();
        }
    } catch (Exception $e) {
        $this->rollbackTransactionOnLevel($transaction, $level);
        throw $e;
    } catch (Throwable $e) {
        $this->rollbackTransactionOnLevel($transaction, $level);
        throw $e;
    }

    return $result;
}

這個(gè)方法接受一個(gè)回調(diào)函數(shù)和事務(wù)的隔離級(jí)別,
從這里我們看出,這個(gè)方法雖然解決重復(fù)代碼,卻還有幾個(gè)問(wèn)題沒(méi)有解決:
第一,這個(gè)方法拋出的異常我們需要在接收外面處理,我們不可能直接拋出,這樣對(duì)客戶端很不友好。
第二:沒(méi)有記錄日志的行為,即使出了問(wèn)題也不容易排除。
第三:其實(shí)還是第一個(gè)問(wèn)題,如果我們需要對(duì)每個(gè)異常做處理,在transaction方法外再嵌套一層try...catch...,那么和沒(méi)有封裝好像沒(méi)什么區(qū)別?

根據(jù)方法可擴(kuò)展不可修改的原則,我們應(yīng)該在自己公共方法里對(duì)這個(gè)方法進(jìn)行重載,重載代碼如下:

public static function TransactionExecute(callable $function,$level=null)
{
    try{
        Yii::$app->db->transaction($function,$level);
}catch (Exception $e){
        //記錄日志
        Yii::error($e->getMessage());
        //這里可以理解成拋出自定義的異常類(lèi)。
        (new self())->returnWayTip(1004, "trans異常錯(cuò)誤");
    }
}

然后回到如何傳參的問(wèn)題,我們可以使用閉包,貼一段偽代碼,如下:

//執(zhí)行事務(wù)
PublicFunction::TransactionExecute(function () use ($token_reward, $reward_info) {
        //業(yè)務(wù)代碼
        $token_reward->save(0);
    MsgHelper::send($reward_info["post_id"], MsgHelper::SOMEONE_FINISH_REWARD, $reward_info);

    });




大功告成,代碼看起來(lái)有沒(méi)有更好看呢?

如有問(wèn)題,歡迎指教。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29233.html

相關(guān)文章

  • 學(xué)Java編程需要注意地方

    摘要:學(xué)編程真的不是一件容易的事不管你多喜歡或是多會(huì)編程,在學(xué)習(xí)和解決問(wèn)題上總會(huì)碰到障礙。熟練掌握核心內(nèi)容,特別是和多線程初步具備面向?qū)ο笤O(shè)計(jì)和編程的能力掌握基本的優(yōu)化策略。   學(xué)Java編程真的不是一件容易的事,不管你多喜歡或是多會(huì)Java編程,在學(xué)習(xí)和解決問(wèn)題上總會(huì)碰到障礙。工作的時(shí)間越久就越能明白這個(gè)道理。不過(guò)這倒是一個(gè)讓人進(jìn)步的機(jī)會(huì),因?yàn)槟阋恢辈粩嗟膶W(xué)習(xí)才能很好的解決你面前的難題...

    leanxi 評(píng)論0 收藏0
  • 基于Yii2應(yīng)用開(kāi)發(fā)引擎RageFrame

    摘要:多入口模式,多入口分為后臺(tái)前端,微信,其他或接口對(duì)接,不同的業(yè)務(wù)不同的設(shè)備進(jìn)入不同的入口。對(duì)接微信公眾號(hào),使用了一款優(yōu)秀的微信非官方,系統(tǒng)內(nèi)已集成了該,調(diào)用方式會(huì)在文檔說(shuō)明,也可直接看其文檔進(jìn)入深入開(kāi)發(fā)。 RageFrame 為二次開(kāi)發(fā)而生,讓開(kāi)發(fā)變得更簡(jiǎn)單。 前言 RageFrame項(xiàng)目創(chuàng)建于2016年4月16日,基于Yii2框架開(kāi)發(fā)的應(yīng)用開(kāi)發(fā)引擎,目前正在成長(zhǎng)中,目的是為了集成更多...

    enda 評(píng)論0 收藏0
  • Yii2多模型與事務(wù)用法

    摘要:目的分析通過(guò)實(shí)戰(zhàn),分享多模型與事務(wù)的簡(jiǎn)單用法。多模型驗(yàn)證數(shù)據(jù)全部通過(guò)后才能保存數(shù)據(jù),否則保存失敗事務(wù)保存數(shù)據(jù)遇到異常會(huì)把原來(lái)已保存的數(shù)據(jù)撤銷(xiāo)。多模型表與表之間無(wú)聯(lián)系,事務(wù)表與表之間要有聯(lián)系。相關(guān)資料多模型的復(fù)合表單事務(wù)事務(wù)什么情況使用 前言 Yii2的多模型與事務(wù)平時(shí)用的也挺多的,但是網(wǎng)上現(xiàn)有的資源不多,為此我覺(jué)得有必要做個(gè)總結(jié)與分享,雷鋒同志的一貫作風(fēng),不做解釋。在利用大伙喝咖啡的時(shí)...

    BigNerdCoding 評(píng)論0 收藏0
  • Yii2多模型與事務(wù)用法

    摘要:目的分析通過(guò)實(shí)戰(zhàn),分享多模型與事務(wù)的簡(jiǎn)單用法。多模型驗(yàn)證數(shù)據(jù)全部通過(guò)后才能保存數(shù)據(jù),否則保存失敗事務(wù)保存數(shù)據(jù)遇到異常會(huì)把原來(lái)已保存的數(shù)據(jù)撤銷(xiāo)。多模型表與表之間無(wú)聯(lián)系,事務(wù)表與表之間要有聯(lián)系。相關(guān)資料多模型的復(fù)合表單事務(wù)事務(wù)什么情況使用 前言 Yii2的多模型與事務(wù)平時(shí)用的也挺多的,但是網(wǎng)上現(xiàn)有的資源不多,為此我覺(jué)得有必要做個(gè)總結(jié)與分享,雷鋒同志的一貫作風(fēng),不做解釋。在利用大伙喝咖啡的時(shí)...

    rubyshen 評(píng)論0 收藏0
  • 大前端- 收藏集 - 掘金

    摘要:下面圍繞的這樣的目的,即左右知乎網(wǎng)頁(yè)上屏幕截圖功能的實(shí)現(xiàn)前端掘金背景最近注意到知乎的屏幕截圖反饋功能,感覺(jué)非常不錯(cuò)。正如你期望的,文中的闖關(guān)記之垃圾回收和內(nèi)存管理前端掘金題圖來(lái)源,授權(quán)基于協(xié)議。 微信小程序?qū)崙?zhàn)學(xué)習(xí) 起手式 DEMO 仿肯德基 - 前端 - 掘金小程序?大場(chǎng)景? 微信小程序本質(zhì)上來(lái)說(shuō)就是一個(gè) HTML 5(移動(dòng)網(wǎng)頁(yè)) 應(yīng)用,用view、scoll-view代替了div標(biāo)...

    LdhAndroid 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<