Yii 框架不一樣邏輯處理方法統一事務處理

一、定義事務處理接口php

<?php

namespace frontend\business\SaveRecordByransactions;

/**
 * Interface ISaveForTransaction 事物提交接口
 * @package frontend\business\RewardTransactions
 */
interface ISaveForTransaction
{
    function SaveRecordForTransaction(&$error,&$outInfo);
} 

 

二、新建統一事務處理的方法類數組

<?php

namespace frontend\business;


use frontend\business\SaveRecordByransactions\ISaveForTransaction;
use yii\base\Exception;
use yii\db\Transaction;
use yii\log\Logger;

class SaveByTransUtil
{
    /**
     * 事物保存支持
     * @param $objList  須要保存的對象數組,
     * @param $error
     * @return bool
     * @throws \yii\db\Exception
     */
    public static function RewardSaveByTransaction($objList,&$error,&$outInfo = null)
    {
        $error ='';
        if(!isset($objList) || !is_array($objList))
        {
            $error = '非法對象,不是數組';
            return false;
        }
        foreach($objList as $obj)
        {
            if(!($obj instanceof ISaveForTransaction))
            {
                $error = '對象數組中存在非ISaveForTransaction對象';
                return false;
            }
        }
        $outInfo = [];
        $trans = \Yii::$app->db->beginTransaction(Transaction::REPEATABLE_READ);
        try
        {
            foreach($objList as $obj)
            {
                if(!$obj->SaveRecordForTransaction($error,$outInfo))
                {
                    if(is_array($error))
                    {
                        \Yii::getLogger()->log(var_export($error,true).' type:'.var_export($obj,true),Logger::LEVEL_ERROR);
                    }
                    else
                    {
                        \Yii::getLogger()->log($error.' type:'.var_export($obj,true),Logger::LEVEL_ERROR);
                    }
                    $trans->rollBack();
                    return false;
                }
            }
            $trans->commit();
        }
        catch(Exception $e)
        {
            $error = $e->getMessage();
            $trans->rollBack();
            return false;
        }
        return true;
    }
} 

三、要進行事務處理的方法類必須繼承事務處理接口ISaveForTransaction 並重寫裏面的SaveRecordForTransaction方法app

<?php

namespace frontend\business\SaveRecordByransactions\SaveByTransaction;


use frontend\business\SaveRecordByransactions\ISaveForTransaction;
use yii\base\Exception;

/**
 * 修改增長實際豆數
 * Class ModifyBalanceByTicketToCash
 * @package frontend\business\UserAccountBalanceActions
 */
class ModifyBalanceByAddRealBean implements ISaveForTransaction
{
    private  $balance = null;
    private  $extend_params=[];

    /**
     * @param $record
     * @param array $extend_params
     * @throws Exception
     */
    public function __construct($record,$extend_params=[])
    {
        $this->balance = $record;
        $this->extend_params = $extend_params;
    }

    public function SaveRecordForTransaction(&$error,&$outInfo)
    {
        //邏輯處理
        return true;
    }
} 

四、調用事務處理frontend

實例化不一樣業務處理類到數組$transActions,最後統一調用事務處理方法RewardSaveByTransactionyii

<?php
$transActions = [];
$transActions[] = new ModifyBalanceByAddRealBean($userBalance,$param);
$transActions[] = new ModifyGift($params);

if(!SaveByTransUtil::RewardSaveByTransaction($transActions,$error))
{
    return false;
}
相關文章
相關標籤/搜索