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

## 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们 如何才能让开发更简单呢

未完 待续--

详情见下节

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 彻底搞懂async/await

前言 Talk is cheap, Show you the code first! private void button1_Click(object sender, EventArgs e) {Console.WriteLine("111 balabala. My Thread ID is :" Thread.CurrentThread.ManagedThreadId);AsyncMethod();Console.WriteLine("222 …

matlab平滑窗滤波,matlab实现平滑滤波

clc;clear;close all;imimread(‘p1.jpg‘);im rgb2gray(im);imdouble(im);imim/max(im(??);figure(‘Name‘,‘原图‘,‘NumberTitle‘,‘off‘);imshow(im,[0,1]);P1 imnoise(im,‘gaussian‘,0,0.005); % adding gaussian noise 这里im是原始图像,添加了均值…

c#之task与thread区别及其使用

1.什么是thread 当我们提及多线程的时候会想到thread和threadpool,这都是异步操作,threadpool其实就是thread的集合,具有很多优势,不过在任务多的时候全局队列会存在竞争而消耗资源。thread默认为前台线程,主程序必须等…

java内存分配和垃圾回收,Java内存分配与垃圾回收

1.JVM管理的内存包含下图所示的几个运行时数据区域,其中方法区和堆为线程共享的数据区域,程序计数器,虚拟机栈以及本地方法栈为线程私有的数据区域。程序计数器:可以看做是当前线程所执行的字节码的行号指示器,告诉字节…

谈谈你对闭包的理解?

闭包这个概念好难理解,身边朋友们好多都稀里糊涂的,稀里糊涂的林老冷希望写下这篇文章能够对稀里糊涂的伙伴们有一些帮助~ 请大家跟我理解一下,如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们…

php有哪些开源社区,PHP开源社区

简介Blade 是 Laravel 提供的一个简单而又强大的模板引擎。和其他流行的 PHP 模板引擎不同,Blade 并不限制你在视图中使用原生 PHP 代码。所有 Blade 视图文件都将被编译成原生的 PHP 代码并缓存起来,除非它被修改,否则不会重新编译&#xff…

GetType和typeof的区别

typeof: The typeof operator is used to obtain the System.Type object for a type. 运算符,获得某一类型的 System.Type 对象。 Type t typeof(int); GetType: Gets the Type of the current instance. 方法,获取当前实例的类型。 int i 10; Consol…

PHP mysql数据迁移,如何自动化PHP/MySQL应用程序的迁移(架构和数据)

我有一个“Schema”对象,我使用 – 但你可以做同样没有类..你想做的是创建一个“db_schema_versions”表:CREATE TABLE db_schema_versions (table varchar(255) NOT NULL PRIMARY KEY,version INT NOT NULL)在您的数据库可以跟踪它是什么版本#之后 – 它…

【转】c# 协变与抗变

转自: 协变和抗变 一.定义 在说定义之前,先看一个简单的例子: public class Shape { } public class Rectange : Shape { } 上面定义了两个简单的类,一个是图形类,一个是矩形类&#xff1…

逆变与协变

一、遇到问题 这是基于.net3.5开发&#xff0c;实际工作中遇到一个问题。假设我们有一个 Base 类&#xff0c;一个 Derived 类&#xff0c;Derived 继承了 Base。如下&#xff1a; 1 2 3 4 5 6 7 8 class Base { } class Derived : Base { }   当我用IEnumerable<Bas…

php新手用7.2,总结PHP升级7.2之后需要注意的事情

最近升级了PHP版本&#xff0c;从7.1升级到7.2&#xff0c;升级前版本&#xff1a;PHP 7.1.14 (cli) (built: Feb 2 2018 08:42:59) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.1.14…

第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式

一. 背景 说起EF的增删改操作&#xff0c;相信很多人都会说&#xff0c;有两种方式&#xff1a;① 通过方法操作 和 ② 通过状态控制。 相信你在使用EF进行删除或修改操作的时候&#xff0c;可能会遇到以下错误&#xff1a;“ The object cannot be deleted because it was n…

win7和mysql乱码,win7 mysql中文乱码怎么处理

方法/步骤【第一步】在mysql dos命令窗口中输入下面这段命令SHOW VARIABLES LIKE character_set_%; //注 用于显示【mysql 的编码设置】2显示了之后 显示你的mysql编码设置和我的不同之处改掉就OK了【你直接复制下面的命令 粘贴到dos命令窗口中就OK了】【注 我这个改法 只有新添…

第十六节:语法总结(3)(C#6.0和C#7.0新语法)

一. C# 6.0 新语法 1. 自动属性初始化可以赋值 1 /// <summary>2 /// 自动属性初始化3 /// </summary>4 public class UserInfor5 {6 public string userId { get; set; } "123456";7 8 public string userName {…

php仿伊人集源码,仿伊人集wecenter()包含所有功能及官方付费插件,整站带数据...

演示地址&#xff1a;如有演示站请以演示为准&#xff0c;无演示站以截图为准,源码太多服务器有限&#xff0c;无法搭建所有源码演示站&#xff0c;请谅解&#xff01;新手购买指导&#xff1a;1.在本站注册账号 丨 2.登录已注册账号充值源码所需金币 丨 3.登录账号下载所需源码…

第十七节:易混淆的概念(静态和非静态、拆箱和装箱)

一. 静态和非静态 1. 概念介绍 ① 静态类&#xff08;被static修饰&#xff09; vs 普通类&#xff08;没有被static修饰&#xff09; ② 静态成员&#xff1a;被static修饰的成员&#xff0c;比如&#xff1a;静态方法、静态字段等 ③ 普通成员(实例成员)&#xff1a;不被st…

perl连接oracle的方法,Perl 连接Oracle 数据库

1.安装DBI和DBD::Oracle 模块。下载地址&#xff1a;搜索DBI&#xff0c;DBD::Oracle如果你的linux可以连接网络&#xff0c;执行命令&#xff1a;#wget#wget下载到当前目录。2.安装这里主要都是源码安装。解压到目录&#xff1a;DBI-1.622#tar –zxvf DBI-1.622.tar.gz安装可…

第十八节:跨域请求的解决方案和WebApi特有的处理方式

一. 简介 前言&#xff1a; 跨域问题发生在Javascript发起Ajax调用&#xff0c;其根本原因是因为浏览器对于这种请求&#xff0c;所给予的权限是较低的&#xff0c;通常只允许调用本域中的资源&#xff0c; 除非目标服务器明确地告知它允许跨域调用。假设我们页面或者应用已在 …

bit类型在oracle,奇怪的Oracle bitand函数

最近在用Oracle的bitand函数是遇到了一个奇怪的现象&#xff1a;declaren number default374123538;val number;begindbms_output.enable;val : bitand(n,16777215);dbms_output.put_line(val);end;/结果正确&#xff1a;5024786PL/SQL procedure successfully completed然后修…

ORM系列之Entity FrameWork详解

一. 谈情怀 从第一次接触开发到现在&#xff08;2018年&#xff09;&#xff0c;大约有六年时间了&#xff0c;最初阶段连接数据库&#xff0c;使用的是【SQL语句ADO.NET】&#xff0c;那时候&#xff0c;什么存储过程、什么事务 统统不理解&#xff0c;生硬的将SQL语句传入SQL…