Tp5,Service使用
C层,操控数据库,并处理页面数据展示。
M层,纯粹的操作自己所对应的数据库。
Service层,可以通用的处理一些逻辑计算,也可以将复杂的数据表处理整合到一起,也可以将复杂的业务逻辑整合到一起。
创建了一个CommonService
<?php
/**
* Created by PhpStorm.
* User: jiqing
* Date: 18-12-21
* Time: 下午8:49
*/
namespace app\common\service;
// 服务层,介于C层与M层之间
/** 根据上面的分析,Service夹在C层和M层中间,从逻辑上大致划分为3大类:
### model侧的Service:也就是封装每个model与业务相关的通用数据接口,比如:查询订单。(我认为:访问远程服务获取数据也应该归属于这一类Service)
### 中间的Service:封装通用的业务逻辑,比如:计算订单折扣(会用到1中的Service)。
### controller侧的Service:基于1、2中的Service进一步封装对外接口的用户业务逻辑。
**/
class CommonService
{
protected $out_data;
// 构造函数
public function __construct()
{
$this->out_data = ['errno'=>0,'errdesc'=>''];
}
public function set_err($errno,$errdesc) {
$this->out_data['errno'] = $errno;
$this->out_data['errdesc'] = $errdesc;
}
public function set_data($data) {
$this->out_data['data'] = $data;
}
}
主要用于输出数据的设置。
用户层的服务,
<?php
/**
* Created by PhpStorm.
* User: jiqing
* Date: 18-12-21
* Time: 下午8:49
*/
namespace app\common\service;
// 服务层,介于C层与M层之间
/** 根据上面的分析,Service夹在C层和M层中间,从逻辑上大致划分为3大类:
### model侧的Service:也就是封装每个model与业务相关的通用数据接口,比如:查询订单。(我认为:访问远程服务获取数据也应该归属于这一类Service)
### 中间的Service:封装通用的业务逻辑,比如:计算订单折扣(会用到1中的Service)。
### controller侧的Service:基于1、2中的Service进一步封装对外接口的用户业务逻辑。
**/
use app\common\model\UserAuditLogModel;
use app\common\model\UserModel;
class UserService extends CommonService
{
public function audit_user($id,$is_pass,$reason) {
if (!$id || !$is_pass) {
$this->set_err('10001','参数缺失');
return $this->out_data;
}
// 处理审核
$user = new UserModel();
$user_info = $user->where('id',$id)->find();
if (!$user_info) {
$this->set_err('10002','用户不存在');
return $this->out_data;
}
if ($is_pass == 1) { // 通过
$edit_data = [
'status' => UserModel::USER_STATUS_PASS,
'audit_time' => time()
];
} else {
$edit_data = [
'status' => UserModel::USER_STATUS_NOT_PASS,
'audit_time' => time()
];
}
$user->startTrans();
$err_count = 0;
$res = $user->save($edit_data,['id'=>$id]);
if (!$res) {
$err_count++;
}
if ($user_info['type'] == UserModel::USER_TYPE_PERSON) {
$apply_info = [
'type' => $user_info['type'],
'telphone' => $user_info['telphone'],
'realname' => $user_info['realname'],
'idcard' => $user_info['idcard'],
'work_unit' => $user_info['work_unit'],
'work_position' => $user_info['work_position'],
'is_party' => $user_info['is_party'],
'is_volunteer' => $user_info['is_volunteer'],
];
} else {
$apply_info = [
'type' => $user_info['type'],
'telphone' => $user_info['telphone'],
'realname' => $user_info['realname'],
'company_name' => $user_info['company_name'],
'legal_name' => $user_info['legal_name'],
'company_address' => $user_info['company_address'],
];
}
$apply_info = json_encode($apply_info,JSON_UNESCAPED_UNICODE);
// 写入日志
$log_data = [
'uid'=>$user_info['id'],
'is_pass'=>$is_pass,
'reason' =>$reason,
'add_time' => time(),
'apply_info' => $apply_info
];
$user_audit_log = new UserAuditLogModel();
$add_res = $user_audit_log->save($log_data);
if (!$add_res) {
$err_count++;
}
if ($err_count > 0) {
$user->rollback();
$this->set_err(10099,'操作失败,请重试');
return $this->out_data;
} else {
$user->commit();
$this->set_err(0,'操作成功');
return $this->out_data;
}
}
}
里面操作了两个数据表,并使用事务。同时能够通过out_data将错误信息进行反馈到C层。
C层就简单多了。
// 审核用户
public function audit_user() {
$id = $_POST['id'];
$is_pass = $_POST['is_pass'];
$reason = input('post.reason/s','无');
if (!$id) {
$this->json->setErr(10001,'缺少参数');
$this->json->Send();
}
if (!$is_pass) {
$this->json->setErr(10002,'缺少参数');
$this->json->Send();
}
$user_service = new UserService();
$res = $user_service->audit_user($id,$is_pass,$reason);
if ($res['errno'] == 0) {
$this->json->setErr(0,'操作成功');
$this->json->Send();
} else {
$this->json->setErr($res['errno'],$res['errdesc']);
$this->json->Send();
}
}
经过Service的处理,C层和M层之间多了一个中间层。它不仅仅可以处理数据库的数据,它还可以处理各种验证之类的事情。计算之类的事情。
Service层很有意思。
Tp5,Service使用的更多相关文章
- thinkphp5+nginx的linux环境搭建
安装环境&工具安装php安装nginx运行服务器安装thinkphp安装Composer安装thinkphp配置nginx.conf配置php-fpm运行thinkphp注意事项 php7已经 ...
- TP5 中实现支付宝支付 利用model层调用支付宝类库
<?php /** * Created by PhpStorm. * User: admin * Date: 2017/8/16 * Time: 09:16 */ namespace app\a ...
- tp5入门
runtime目录里的文件是临时文件,可随时删除 在tp5里,命名空间对应了文件的所在目录,app命名空间通常代表了文件的起始目录为application,而think命名空间则代表了文件的起始目录为 ...
- PHP7 学习笔记(十四)Reids 键空间通知配合TP5 实现分布式延时任务
测试环境:windows 10 + phpStudy 配置redis配置文件 redis.windows.conf notify-keyspace-events "Ex" 重启re ...
- PHP 服务器及TP5框架遇到的几个错误
一.Call to undefined function imagecreatefrompng(): LAMP环境搭建的博客,在提交内容的时候TP5框架报了一个错误,Call to undefined ...
- 续安装好composer和workerman之后;TP5运行workerman的操作
TP5想要实现时时通讯:首先先安装好composer和workerman,我之前有写一篇安装的方法,在cmd里面安装:tp5手册上面有写cmd命令的代码:接下来是安装好后如何运行的: 首先在项目中建立 ...
- thinkPHP5配置nginx环境无法打开(require(): open_basedir restriction in effect. File(/mnt/hgfs/root/tp5/thinkphp/start.php) is not within the allowed path(s)
今天想把玩一下tp5,结果怎么都无法访问,每次都是报500错误,我把错误提示都打开看到下面的错误 require(): open_basedir restriction in effect. File ...
- 基于TP5.1实用案例及教程
推荐<基于TP5.1实用案例及教程>书 目录: 通用封装 Export通用封装Import通用封装配合Import通用封装的ImportBaseVerify类Files通用封装Direct ...
- lnmp+tp5安装纪要
1: lnmp : https://lnmp.org/install.html 官网安装帮助 运行命令:wget http://soft.vpser.net/lnmp/lnmp1.6.tar.gz ...
随机推荐
- Golang学习 - builtin 包
Go builtin包提供了go预先声明的函数.变量等的文档.这些函数变量等的实现其实并不是在builtin包里,只是为了方便文档组织. 这些内置的变量.函数.类型无需引入包即可使用. 默认提供的有: ...
- postman app支持浏览器上的cookie
1. 安装postman app 注意要安装postman application(一个应用软件),而不是chrome 插件,打开下面的这个开关 2. chrom浏览器 给chrom浏览器安装pos ...
- 三个小时学会wordpress模板制作
最近接了一个项目需要用wordpress建站,版面相对简单,ytkah就琢磨着自己来设计wordpress模板,首页栏目页文章页(很多网站无外乎就这些页面),其中栏目页和首页又很像,都是调用文章列表. ...
- Struts2表单数据接收方式
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/sunshoupo211/article/details/30249239 1.将Action类作 ...
- Linux内核之vmlinux与vmlinuz
因为是初次系统的学习Linux内核,过程中遇到了一些常常出现的名词.似曾相识,但对他们的含义又不是非常清楚.因此,将搜索到的内容进行一下汇总. 1.vmlinux vmlinux是一个包括linu ...
- Spring源码解析(四)Bean的实例化和依赖注入
我们虽然获得了Bean的描述信息BeanDefinition,但是什么时候才会真正的实例化这些Bean呢.其实一共有两个触发点,但是最后实际上调用的是同一个方法. 第一个:在AbstractAppli ...
- MySQL创建索引命令
MySQL索引类型 普通索引 创建索引的方式 -- 直接新建索引 CREATE INDEX indexName ON mytable(username(length)) -- 修改表结构新建索引 AL ...
- 整数(质因子)分解(Pollard rho大整数分解)
整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...
- MapReduce的几个实现
1.倒排索引的实现 import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.con ...
- Thread的六中状态
线程共有6种状态:在某一时刻只能是这6种状态之一.这些状态由Thread.State这个枚举类型表示,并且可以通过getState()方法获得当前线程具体的状态类型. NEW:至今尚未启动的线程的状态 ...