Yii 框架不同逻辑处理方法统一事务处理
1、定义事务处理接口
<?php namespace frontend\business\SaveRecordByransactions; /**
* Interface ISaveForTransaction 事物提交接口
* @package frontend\business\RewardTransactions
*/
interface ISaveForTransaction
{
function SaveRecordForTransaction(&$error,&$outInfo);
}
2、新建统一事务处理的方法类
<?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;
}
}
3、要进行事务处理的方法类必须继承事务处理接口ISaveForTransaction 并重写里面的SaveRecordForTransaction方法
<?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;
}
}
4、调用事务处理
实例化不同业务处理类到数组$transActions,最后统一调用事务处理方法RewardSaveByTransaction
<?php
$transActions = [];
$transActions[] = new ModifyBalanceByAddRealBean($userBalance,$param);
$transActions[] = new ModifyGift($params); if(!SaveByTransUtil::RewardSaveByTransaction($transActions,$error))
{
return false;
}
Yii 框架不同逻辑处理方法统一事务处理的更多相关文章
- 【yii2】 yii框架如果控制器和方法都是多个单词组成应该怎样写请求链接
最近的一个项目碰到这种问题,摸索出了解决办法,故此记录下 example 如果控制器为 ShopCollect 方法为 UserList solution 请求的链接应该为 doman.com/sho ...
- YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)
YII 框架源码分析 百度联盟事业部——黄银锋 目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 ...
- PHP开发框架之YII框架学习——碾压ThinkPHP不是梦
前 言 JRedu 程序猿是一种慵懒的生物!能少敲一行代码,绝对不会多敲一个字符!所以,越来越多的开发框架应运而生,在帮助我们完成功能的同时,极大程度上也帮我们节省了人力物力,而且也提高了系统的 ...
- yii框架的部署方法
yii框架(yii framework)的部署方法 刚開始学习的人来说,部署yii框架还是有一定难度的,Yii是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web ...
- Yii框架CURD方法
在YII框架中,CURD有2种方式: 1.AR模式:2. DAO模式 AR模式下 查全部 MODEL $model->find()->asArray()->all()查单 个 ...
- YII框架的使用
YII框架的使用 spit: 吐痰,吐口水, 过去式: spat spat: 本身也可以作为一个单词, 意思是: "小打小闹""小的吵闹""小争吵&q ...
- 使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server
原文转自 http://www.cnblogs.com/ldms/p/4565547.html Yii 有很多 extension 可以使用,在查看了 Yii 官网上提供的与 OAuth 相关的扩展后 ...
- Yii 框架学习--01 框架入门
Yii 是一个高性能的,适用于开发 WEB2.0 应用的 PHP 框架. Yii目前有两个主要的版本: 2.0 和 1.1.本文以YII 2.0.7为例. 环境需求 Yii2.0 框架有一些系统上的需 ...
- yii框架
Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能.Yii是最有效率的PHP框架之一.Yii是创始人 ...
随机推荐
- Js高级 部分内容 面向对象
1.单列模式 2.工厂模式 3.构造函数 (1)类 js天生自带的类 Object基类 Function Array String Number Math Date Boolean Regex ...
- codeforces 804A Find Amir 思维/水题
A few years ago Sajjad left his school and register to another one due to security reasons. Now he w ...
- vue学习笔记——组件的优化
Vue 应用性能优化指南 1 给组件定义name,然后在同级目录新建index文件: import Count from './count.vue' export Count; 2 优化大数据的列表 ...
- PythonStudy——三种字符串 Three strings
# 普通字符串:u'以字符作为输出单位'print(u'abc') # 用于显示 # 二进制字符串:b'' 二进制字符串以字节作为输出单位print(b'abc') # 用于传输 # 原义字符串:r' ...
- Go之unsafe.Pointer && uintptr 类型
Go语言是个强类型语言.Go语言要求所有统一表达式的不同的类型之间必须做显示的类型转换.而作为Go语言鼻祖的C语言是可以直接做隐式的类型转换的. 也就是说Go对类型要求严格,不同类型不能进行赋值操作. ...
- CANVAS笔记
bglayer.add(bgimage) /*后面的层会覆盖前面的,所以要放在上面的,就要后面才添加!*/ bglayer.add(this.shape1) Layer.destroy() layer ...
- day 13
递归函数 一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但是我们之前已经说过关于函数调用的问题, ...
- LDAP学习总结
一.简介: LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议.目录是一个为查询.浏览和搜索而优化的数据库,它成树状结构组织数据,类 ...
- .Net MVC TextBoxFor 扩展 placeholder 与 class 属性
namespace System.Web.Mvc { public static class HtmlHelperExtensions { public static MvcHtmlString Bs ...
- EXCEL统计不重复值的数量
如这一列中,有多少不重复值? 1.可以点击,数据,删除重复项,清除重复值,然后剩下的统计一下即可知道: ===> 2.用公式:=SUMPRODUCT((MATCH(E3:E20,E3 ...