## TP5实战技巧实例---开发思路

> 子曰:“学而不思则罔,思而不学则殆。”

[TOC]

### 利用TP的MVC框架 做快速开发

>[success] 写在前面的话:既然选择TP5框架,我推荐大家要通读完全开发手册,我这里并不是要大家记住每一个方法,每一个细节.而是要求大家心理清楚TP5到底有哪些功能,能替我们解决什么样的问题!

在程序开发中,随着前端的技术发展,以及跨平台的综合应用,PHP为主流的程序开发越来越侧重开发API.

我们就已API开发为例,介绍一些开发的实际流程.

![](https://box.kancloud.cn/2eb2dc6276bbce6ab92710731eabcb53_740x321.png)

>[info] 一 控制器(Controller)

> 获取参数数据

> 二 验证器(Validate)

> 验证参数数据

> 三 模型 (model)

> 处理逻辑和数据 返回结果

> 四 控制器(Controller)

> 接受模型返回数据 显示数据

#### 控制器数据获取和处理

现在我从网上某TP5开源系统中找了一段控制器中的代码

~~~

public function add()

{

//接收数据

if (Request::instance()->isPost()) {

$data['name'] = input('post.adname');

$data['description'] = input('post.description');

$data['link'] = input('post.link');

$data['position'] = input('post.pos');

$data['level'] = input('post.level');

$data['createtime'] = time();

//链接图片

$coverPath = input('post.banner_path');

//实例化验证器

$validate = Loader::validate('Banner');

//验证

if (!$validate->scene('add')->check($data)) {

return $this->error($validate->getError());

}

//添加封面图

if ($coverPath) {

$data['banner_path'] = $coverPath;

}

//插入数据表

$result = Db::name('Banner')->insert($data);

if ($result) {

return $this->success('添加成功',url('admin/banner/index'));

} else {

return $this->error('添加失败');

}

} else {

$pos=Db::name('BannerPosition')->where('status',1)->field('id,title')->select();

$this->assign('pos',$pos);

return $this->fetch('add');

}

}

~~~

>[warning] 这段代码是其实并没有大的问题 这段添加代码中整合静态页和数据逻辑处理

当post提交时候处理数据,get提交时候渲染静态页面

但有些问题还是能再改进一下就完美了

* * * * *

题外话:我现在我来简单说一下这段代码一些问题

1.在接收片段中使用了Request::instance()->isPost()

既然继承控制器可以直接使用$this->request->isPost()

2.过多的使用了input助手函数

3.非MVC理念 model被完全忽略

* * * * *

我们先讲一下控制器数据获取和处理.我们还拿上面的源代码 进行改进和示范吧

下面是我改进的方案,大家只要理解这样做的好处就可以了.我会先定义一个参数数据的变量数组$param

~~~

$param=[

'name'=>'adname'

'description'=>'description'

... ...

];

~~~

我就写两个 做一下示范

另外我在控制器基类里写了下面一段代码

~~~

/**

* 数据库字段 网页字段转换

* #User: Mikkle

* #Email:776329498@qq.com

* #Date:

* @param $array 转化数组

* @return 返回数据数组

*/

protected function buildParam($array)

{

$data=[];

if (is_array($array)){

foreach( $array as $item=>$value ){

$data[$item] = $this->request->param($value);

}

}

return $data;

}

~~~

那我在继承基类的控制器中 这样写代码就可以执行了,$param_data就是你要获取的参数值.

~~~

$param = [

'name'=>'adname'

'description'=>'description'

];

$param_data = $this->buildParam($param);

~~~

>[info]如上面的例子中的 $data['createtime'] = time();

这种固定的值的添加 记得扔到model的自动完成的方法完成

详情参见 http://www.kancloud.cn/mikkle/thinkphp5_study/331967

#### 控制器中数据值的验证

现在 数据已经获取 下一步就要进行数据验证

>[danger] 永远不要相信前端发送过来的数据 把控绝对不能忽略

当然前端的校验也是需要的 当后端必须要把关

上面这段验证的代码是没有问题的 可以使用

~~~

//实例化验证器

$validate = Loader::validate('Banner');

//验证

if (!$validate->scene('add')->check($data)) {

return $this->error($validate->getError());

}

~~~

当然 使用官方的教程里的方法也是可以的

~~~

$result = $this->validate($data, $validate_name);

if (true !== $result) return ['code' => '1003', 'msg' => $result,];

~~~

>[info] $validate_name 你控制器的名称

#### 验证数据通过后调用Model里的方法获取返回值

~~~

$model_edit = Loader::model($model_name);

if (!$model_edit) return $this->showReturnCode(1010);

$data = $model_edit->$action_name($param_data);

~~~

>[info] $model_name 你模型的名称

> $action_name 你模型中执行方法的名称

这时 绝大多少的操作就基本完成了 根据需求返回$data的值就行了

##现在就是思考的时间 万能的yuan们 如何才能让开发更简单呢

未完 待续--

详情见下节

大家希望后续看到哪方面的 可以在这里留言给我!

php进阶面向对象及tp5,TP5实战技巧---开发思路 引路造桥相关推荐

  1. 【SQL开发实战技巧】系列(十八):数据仓库中时间类型操作(进阶)INTERVAL、EXTRACT以及如何确定一年是否为闰年及周的计算

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  2. 【SQL开发实战技巧】系列(十九):数据仓库中时间类型操作(进阶)如何一个SQL打印当月或一年的日历?如何确定某月内第一个和最后—个周内某天的日期?

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  3. 【SQL开发实战技巧】系列(二十一):数据仓库中时间类型操作(进阶)识别重叠的日期范围,按指定10分钟时间间隔汇总数据

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  4. javascript进阶教程第一章案例实战

    javascript进阶教程第一章案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过练习积累JS的使用技巧 二.实例 练习1:删除确认提示框 实例描述: 防止用户小心单击了"删除& ...

  5. 7个实战技巧帮你提升前端技术水平!

    项目架构 // 1.封装项目的基础库 优秀的基础库可以保证项目的最低质量下限和更好的可扩展性.通常我们说的基础库包括-组件库.基础 css 库.基础工具库. // 2.层级管理 管理你的请求,建议把你 ...

  6. 【SQL开发实战技巧】系列(六):从执行计划看NOT IN、NOT EXISTS 和 LEFT JOIN效率,记住内外关联条件不要乱放

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  7. 【SQL开发实战技巧】系列(十):从拆分字符串、替换字符串以及统计字符串出现次数说起

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  8. 【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  9. 【SQL开发实战技巧】系列(三):SQL排序的那些事

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

最新文章

  1. 14种冷热源及空调系统特点介绍
  2. Python Django 日期增减API
  3. 数据结构和算法 —— 时间复杂度+空间复杂度
  4. 50张神图……好不容易才找到完整版!
  5. 中断下半部机制-softirq-Tasklet-工作队列
  6. 这是一张超级长长长长的长图·····
  7. python建立sqlite数据库_5分钟快速入门,用Python做SQLite数据库开发,附代码适合初学...
  8. Python poetry的使用
  9. Ubuntu Mysql安装配置
  10. stooge sort
  11. HBase编程 API入门系列之delete.deleteColumn和delete.deleteColumns区别(客户端而言)(4)...
  12. 心公正白壁无瑕什么意思?_人工智能可以编写无瑕的代码后,编码会变得无用吗?
  13. [数学] 一般正态曲线函数的积分怎么求?为什么总是1?
  14. 海外旅游最常用的100句英语口语
  15. Halcon|通过旋转前后3维坐标点求旋转轴及旋转角度
  16. 用IntelliJ IDEA自带的文本差异对比器
  17. Android Camera硬件结构组成(一)之 手机摄像头的组成结构和工作原理
  18. hp1015驱动64位_在win10/win7 64位系统上安装 hp laserjet 1015对应的打印机驱动
  19. 垂直搜索 vs 通用搜索
  20. 设计模式 - 装饰器模式

热门文章

  1. IIS7.0站点/虚拟目录中访问共享
  2. Rails 3.1 CoffeeScript SASS初体验
  3. Linux 命令平时积累
  4. 新来乍到,谢谢大家捧场
  5. java phantomjs alert_Python+Selenium+PhantomJS脚本中的Javascript警报
  6. Eclipse export导出war包报错(Module name is invalid.)
  7. 微博air客户端_打磨近十年,接近「完美」的 macOS 第三方微博客户端:Maipo
  8. 火星云分发全网视频_好用的短视频一键分发软件,让工作效率提高10倍
  9. java list 分组_Java 将List中的实体类按照某个字段进行分组并存
  10. nano-pc-t1 4412 显示驱动分析