Tp框架-2

来源:互联网 发布:夜间灯光数据 编辑:程序博客网 时间:2024/06/07 01:55

  常用的路由形式:

   pathinfo路径形式[默认方式]

http://网址/index.php/分组/控制器/操作方法 

http://网址/index.php/Home/Index/advert

   控制器在Controller目录下

 

类名要和控制器文件名一样

1. 简单模板view调用

$this -> display();   //模板名称与当前控制器、当前操作方法的名称一致

$this -> display(模板名称);  //调用当前控制器对应目录指定名称的模板

$this -> display(控制器/模板名称);  //调用其他控制器下的具体模板文件(虽然调用了这个模板文件,但是路由地址是从控制器进来的)

tp框架有两种模式:开发(调试)、生产[默认]

生产模式:错误提示模糊

开发模式:错误提示友好

define(APP_DEBUG,true);   //开发

define(APP_DEBUG,false);   //生产

都在入口文件index.php中定义

1.index目录(方便静态文件的引入)

 

1. 分组设置

tp框架提供了常量:

http://网址/index.php/分组/控制器/操作方法/名称//名称/

__MODULE__:路由地址分组信息 (http://网址/index.php/分组

__CONTROLLER__:路由地址控制器信息  (http://网址/index.php/分组/控制器

__ACTION__:路由地址操作方法信息 (http://网址/index.php/分组/控制器/操作方法

__SELF__:路由地址的全部信息 (http://网址/index.php/分组/控制器/操作方法/名称//名称/值)

MODULE_NAME:  分组名称(获取当前控制器的分组名)

CONTROLLER_NAME:控制器名称(获取当前控制器的控制器名)

ACTION_NAME:操作方法名称(获取当前控制器的方法名)

1. 配置文件

ThinkPHP/Conf/convention.php

shop/Common/conf/config.php

shop/Home/Conf/config.php

1. 连接配置数据库config配置文件

 

在项目的任何位置可以使用C()方法调用配置的名称

2. 创建model模型类

创建存放地址:分组/Model

命名规范:模型名(首字母大写,一般情况下跟数据表名一样)+Model(关键词)+.class.php

 

原则上每个数据表都对应一个Model模型类

 

 

 

两种方式实例化model对象

实例化普通model对象

$model = new \Model\XXXModel();

除了可以实现简单操作(调用父类Model方法实现)

也可以实现一些复杂操作(调用具体普通model方法实现)

实例化基类Model对象

$model = D();   //实例化基类Model,没有关联任何表

$model = D(Goods);   //实例化父类Model对象,并操作xx_goods业务数据表

(该方式允许我们即使不创建具体的model模型类文件,也可以对数据表的数据进行操作)

 

5.3D方法和M方法的区别(看版本而定,有的版本两个方法一样)

D方法是实例化自定义的模型类,而M方法可以实例化父类模型。

.数据基本操作

1. 数据查询操作

调用方法:model对象->select()

具体使用:

$model -> select();      //查询并返回数据表的全部记录信息

$model -> select(主键id);   //查询主键信息等于条件id值的记录

$model -> select(id1,id2,id3...);  //查询主键信息在条件范围内的记录(括号内为字符串)

(使用select()方法会始终返回一个二维数组信息)

 

find方法返回的是一维数组

Find方法:

有两种形式

第一种:$model -> find();表示查询表中的第一条记录

等价于:select * from table limit 1;

第二种:$model -> find(id);表示查询指定id的所在记录。

Find方法要么没有参数,要么只有一个参数

 

建议:如果只需要查询1条记录,建议使用find方法而不去使用select方法,原因是find方法返回的是一维数组,不要去遍历

1.1 具体数据操作方法使用

① where()条件

$model -> where(条件值);  //条件值就是sql语句where后边的结果值,通常以数组的方式书写,比如:where(array(id => 1,name => 2));

② limit()限制条数

   第一种用法:limit 10;表示查询前10条。

   第二种用法:limit 5,10;表示从第五条开始往后查10条数据。

$model -> limit(数字);  //严格查询数字条数的记录

③ field()限制查询字段

$model -> field(字段1,字段2,字段3);

Field方法只有一个参数,要求必须是字符串,不管需要查询多少个字段的信息。

④ order() 排序

$model -> order(字段asc/desc);

⑤ group()分组查询group by

$model -> group(‘字段名’);

⑥ having()条件设置方法(通常和groupby结合使用,后面的条件是结果集条件)

having设置查询条件的效果 与where使用效果类似

区别:

where:语句条件字段,必须是“数据表中存在的”字段

having:语句条件字段  必须是查询结果集中存在的字段

 

 

 

where()/limit()/field() 三个方法直接存在于父类Model里边

having()/order()/group() 三个方法存在于Model的魔术方法__call()里边

1.2连贯操作

以上具体方法在使用的时候可以一并使用多个,形成连贯操作,并且没有顺序要求

model必须是在最前面,具体的CURD操作方法必须是在最后面,而中间的辅助方法的顺序,是随意的

但是:为了养成良好的习惯,建议:field()->where()->limit()->order()->groupby()->select()

例如:

$obj  -> limit() -> order() -> field() -> having() -> group()

 

2. 数据添加操作

调用方法:model对象->add() 

具体两种方式使用:

数组方式

$数组 = array(

元素(下标=>元素值)

元素(下标=>元素值)

)

下标:必须是数据表字段名称(否则不给添加到数据记录里边)

$model(普通对象) ->add(数组);(返回的是添加的主键id)

数组的元素键名与数据表字段的名称必须一致

AR规范要求:

① 一个model模型与一个具体的数据表对应

② model模型类实例化的对象 数据表的一条记录对应

③ model对象的属性 记录的字段对应

TP框架的AR仿真产品,因为在每个业务Model模型类里边并不存在对应数据表的字段信息。

 

3. 数据修改操作

调用方法:model对象->save()

以目前的知识储备,要求数组中必须要有主键信息(where条件)

add添加一致具体两种方式使用:

数组方式

$model -> save(数组);

数组的元素(属性字段)必须与数据表字段保持一致

save()方法返回受影响的记录条数

注意:数据修改必须设置条件,主键id where()方法,二选一即可否则执行失败。

6. 数据删除操作

 

五、ThinkPHP中的统计查询(重点)

在原生的sql语句中经常会用到一些对数据的统计查询语句,比如说求最大值、最小值、平均值等,在ThinkPHP中也同样封装了相应的操作方法,有如下几种:

• count()求总记录数

• max()    求某个字段的最大值

• min()     求某个字段的最小值

• avg()     求字段的平均值

• sum()     求字段的总和

1count方法

作用:求总记录数

语法格式:$model -> count();//没有参数(统计记录表的总条数)

 

2max方法

作用:求出指定字段中的最大值。

基本语法格式:$model -> max(‘字段名’);要求传递字段名作为参数

 

3min方法

作用:获取指定字段的最小值。

基本语法格式:$model -> min(字段);

4avg方法

作用:是求指定字段的平均值。

基本语法格式:$model -> avg(字段名);

5sum方法

作用:求指定字段的总合。

基本语法格式:$model -> sum(字段)

综上5个案例,发现返回值都是字符串。

6、实现某个字段加一
setInc('sumperson',1);

 

如果不加空格,则报错!!

7. 执行原生sql语句

$sql = insert   select  update  delete ......;

① 查询语句:  $model对象-> query($sql);    返回一个二维数组结果  

② 添加/修改/删除语句:  $model对象-> execute($sql);   返回受影响记录条数(或添加的主键id

8. 模板中U方法的使用

 

I方法的使用

接收:在原先学习php的时候,接收post数据使用的是$_POST,但是在ThinkPHP中,系统为我们封装了一个快捷方法,可以用于接收数据(还有过滤功能),这个方法是:I方法

 

1、会话控制

在原生的php中提供了sessioncookie的会话支持,在ThinkPHP中也提供对上述两种会话控制的支持。

1.1session支持

• session(‘name’,’value’)设置一个名为namesession,值是value

• $value = session(‘name’)获取一个名为namesession

• session(‘name’,null)删除一个名为namesession

• session(null)删除全部的session

• session(‘?name’)判断指定的名为namesession是否存在

说明:session方法是ThinkPHP封装的方法(不是php内置的方法),在原生的php中使用session一定要session_start,并且前面不能有任何的输出,但是在ThinkPHPsession方法没有上述的要求

1.2cookie支持

• cookie(‘name’,’value’)设置一个名为namecookie值是value

• cookie(‘name’,’value’,3600)同样也是设置,加了有效期(单位是S

• $value = cookie(‘name’)获取一个名为namecookie

• cookie(‘name’,null)删除一个名为namecookie

• cookie(null)删除全部的cookie(用不了)

• cookie()获取全部的cookie

• 

特别说明:上述的几个使用方法中第五个(删除全部cookie的那个),有bug,需要修改底层代码之后才能使用,切记,切记,切记!!!

 

2、文件加载(重点)

函数库:分为两大类,一类是系统函数库(functions.php),另一类是自定义函数库(function.php),系统函数库文件名中有个s,而自定义的是没有的。

说明:在应用层级的函数库文件中的函数,可以在当前应用的全部分组中使用;而如果是在分组中定义的函数库文件只能在当前的分组中使用

2.3load方法加载

Load(‘@/filename’)//表示载入当前分组下的filename.php文件

五、多表连接(重点)

1Table多表连接方式

 

2join多表连接方式(习惯了用join

原生的sql语句:select t1.*,t2.name as dept_name from tp_dept as t1 left join tp_dept as t2 on t1.pid = t2.id;

语法格式:$model -> join(具体的连接方式表名 ON条件) -> CURD();

 

默认是innerJoin,如果不用可以使用left joinrightjoin (一般innerjoin就足够用了)

关于给表起别名

$model -> alias(表名的别名);用于设置当前数据表的别名。

显示跟踪信息

跟踪信息:就是显示当前请求所执行的一些细节信息(服务器的信息,请求的信息,加载的文件等等)。

 

 

开启调试模式

 

1.3sql调试(重点)

$model > getLastSql();  含义:表示获取当前模型最后一条执行成功sql语句。

案例:用上述方法获取部门列表方法中的最后一条sql语句

 

补充:在ThinkPHP3.2之后的版本,getLastSql方法有了一个简写的方法:_sql()

 

.实现表单自动验证

 

二. 命名空间

1. 什么是命名空间

php程序语言里边,语法规则要求同名称函数类名常量在一个请求里边不允许出现多次。如果有的应用程序不得已必须出现多个同名的函数、类名、常量,那么我们就可以把它们放到不同的空间里边做请求。这个不同的空间就称作命名空间”。

 

上图在同一个请求里边定义两个同名的函数getInfo(),右图由于有使用命名空间,使得程序可以正常执行。

 

2. 使用命名空间

通过namespace关键字声明命名空间。

namespace  空间名称;

命名空间针对 函数、类名、const常量 三部分起作用,并统称为元素”。

常量的声明:

define(名称,值);  //(在类外部声明常量)与命名空间没有关系

const  名称=;  //与命名空间有关系

const可以在类的内部声明常量信息(类常量)

const也可以在类外部声明常量(正常常量)

使用命名空间的时候const可以放到类外部声明常量。

constdefine的区别:

前者针对命名空间发生影响,后者不发生影响。

const可以声明多个同名称的常量

define对同名称常量只能声明一个

3. 子级(多级)空间

命名空间可以让我们存放许多元素(函数、类、常量),有的时候元素比较多,为了管理方便,可以对元素进行分门别类地存储。也就是说命名空间可以设置为多级空间。多级空间的最后一级空间就称为“子级空间”

 

4.1 空间引入

 

4.2 元素引入

use  空间\空间\空间\元素;

 

 

6. 命名空间使用注意

1) 声明命名空间的当前脚本的第一个namespace关键字前面不能有任何代码(header头代码也要写在下边)

2) 命名空间是虚拟抽象的空间,不是真实存在的目录

3) 相同请求的不同文件的同名空间里边不能有同名元素

有许多文件可以使用同名称的命名空间

如果一个请求把它们都引入进来了,则他们的同类型元素不能出现多个同名称的

 

7. tp框架中使用命名空间

 

8. tp框架验证码使用

 

1. 校验验证码

 

三.附件上传

涉及技术点:

<form enctype=multipart/form-data>

<input type=file>

</form>

 

四.缩略图

 

 

五.数据分页

2. 利用分页工具类实现分页效果

 

2. 验证码、附件上传、缩略图

Think/Verify.class.php

Think/Upload.class.php

Think/Image.class.php

两种方式实例化功能类对象:

① 完全限定名称  $obj = new \Think\Verify();

② 空间类元素引入  use  Think\Verify;  $obj = new Verify();

RBAC

RBAC: role  base  access  control  基于角色的用户访问权限控制

 

1.基于角色的权限分配

 

5、视图中使用函数(重点)

使用原生的比较简单:<?php echo date(Y-m-d,变量); ?>

在模板中要学会用原生的php标签

• 语法:{$name|fn1|fn2=arg1,arg2,###}

|:变量修饰器(Linux中也会用到,在Linux中叫管道)

Fn1:需要使用的第一个函数名

Fn2:需要使用的第二个函数名

Arg1:表示函数所使用到的参数

Arg2:表示函数所使用到的参数

###:表示变量自身(表示$name),###有个名字叫“占位符”

 

 

特别说明:模版中使用函数的时候,如果函数只有一个参数,则可以不写参数,如果参数不止一个,并且第一个参数是变量自身,则也可以不写

8、文件包含

引入使用include标签,语法如下:

• <include file="模板文件名"/>

 

语法:<include file=’[控制器名/]模版文件名’/>

 

9、视图中的数组遍历(重点!!!

php中使用for循环,foreach语句。

ThinkPHP中支持在模版中进行数组遍历操作,遍历操作有两种写法,一是foreach语句,二是使用volist语句。

Volist:是增强版的循环遍历方法,有好几个参数,支持对循环遍历的控制;

Foreach:是基础班的循环遍历方法,只有2个参数,不支持对循环遍历的控制;

9.1volist

Volist语法格式:

 

 

 

9.2foreach

Foreach标签的语法格式:

 

 

10if标签

 

ThinkPHP3.2中,支持不写控制器中的方法,只要模版存在同样可以访问

 

 

日常tp框架只是点总结

1获取当前页的页码

 

对于多张表共同存在的字段,查询或删除的时候,要根据这个共同的字段进行操作

2Tp框架修改默认的成功、失败、报错模板

1. /*错误页面模板 */

2. 'TMPL_ACTION_ERROR'     =>  MODULE_PATH.'View/Public/error.html', //默认错误跳转对应的模板文件

3. 'TMPL_ACTION_SUCCESS'   =>  MODULE_PATH.'View/Public/success.html', //默认成功跳转对应的模板文件

4. 'TMPL_EXCEPTION_FILE'   =>  MODULE_PATH.'View/Public/exception.html',//异常页面的模板文件

3、app_debug模式
&(引用方法)存在时,当关闭调试模式时,会报错(至此原因未知)

在关闭调试模式的时候,redirect方法(或控制器+路由的方法)会将控制器或方法的名称都转换成小写

4、C方法

Tp框架中的c方法用来从配置文件中,读取已配置的值c(配置的名字)

还可以C(名字,)还可以给配置文件值

5、可以定义多个模型

1. 数据层:Model/UserModel 用于定义数据相关的自动验证和自动完成和数据存取接口

2. 逻辑层:Logic/UserLogic 用于定义用户相关的业务逻辑

3. 服务层:Service/UserService 用于定义用户相关的服务接口等

1. namespace Home\Model;

2. use Think\Model;

3. class UserModel extends Model{

4. }

逻辑层:Home/Logic/UserLogic.class.php

1. namespace Home\Logic;

2. use Think\Model;

3. class UserLogic extends Model{

4. }

服务层:Home/Service/UserService.class.php

1. namespace Home\Service;

2. use Think\Model;

3. class UserService extends Model{

4. }

5. 实例化相应的模型

1. D('User') //实例化UserModel

2. D('User','Logic') //实例化UserLogic

3. D('User','Service') //实例化UserService

6、跟空间

3.2版本全面采用命名空间方式定义和加载类库文件,有效的解决多个模块之间的冲突问题,并且实现了更加高效的类库自动加载机制。

命名空间的概念必须了解,否则会成为3.2版本开发的重大障碍。
如果不清楚什么是命名空间,可以参考PHP手册:PHP命名空间

由于新版完全采用了命名空间的特性,因此只需要给类库正确定义所在的命名空间,而命名空间的路径与类库文件的目录一致,那么就可以实现类的自动加载。例如,Org\Util\File类的定义为:

1. namespace Org\Util;

2. class File {

3. }

其所在的路径是ThinkPHP/Library/Org/Util/File.class.php,因此,如果我们实例化该类的话:

1. $class= new \Org\Util\File();

系统会自动加载ThinkPHP/Library/Org/Util/File.class.php 文件。

注意:和3.1不同,我们无需在实例化命名空间定义的类之前导入类库文件了。

6根命名空间

根命名空间是一个关键的概念,以上面的Org\Util\File类为例,Org就是一个根命名空间,其对应的初始命名空间目录就是系统的类库目录(ThinkPHP/Library),Library目录下面的子目录会自动识别为根命名空间,这些命名空间无需注册即可使用。

模块中的类库命名空间的根都是以模块名命名,例如:

1. namespace Home\Model;

2. class UserModel extends \Think\Model{

3. }

其类文件位于Application/Home/Model/UserModel.class.php

特别注意:如果你需要在3.2版本中实例化PHP内置的类库或者第三方的没有使用命名空间定义的类,需要采用下面的方式:

1. $class=    new \stdClass();

2. $sxml  =    new \SimpleXmlElement($xmlstr);

7手动加载第三方类库

如果要加载第三方类库,包括不符合命名规范和后缀的类库,以及没有使用命名空间或者命名空间和路径不一致的类库,或者你就是想手动加载类库文件,我们都可以通过手动导入的方式加载。

我们可以使用import方法导入任何类库,用法如下:

1. // 导入Org类库包 Library/Org/Util/Date.class.php类库

2. import("Org.Util.Date");

如果你的第三方类库都放在Vendor目录下面,并且都以.php为类文件后缀,也没用采用命名空间的话,那么可以使用系统内置的Vendor函数简化导入。例如,我们把 Zend 的 Filter\Dir.php 放到 Vendor 目录下面,这个时候 Dir 文件的路径就是 Vendor\Zend\Filter\Dir.php,我们使用vendor 方法导入只需要使用:

1. Vendor('Zend.Filter.Dir');

如果类库文件没有命名空间的话实例化的时候需要加/空间

8、前置和后置操作

前置和后置操作指的是在执行某个操作方法之前和之后会自动调用的方法,不过仅对访问控制器有效

 

上面的代码会依次输出before,index,after

 Linux系统配置好:'URL_CASE_INSENSITIVE' =>true;之后,控制器和方法就不区分大小写了

U方法传参:

参数

U方法的第二个参数支持数组和字符串两种定义方式,如果只是字符串方式的参数可以在第一个参数中定义,例如:

1. U('Blog/cate',array('cate_id'=>1,'status'=>1))

2. U('Blog/cate','cate_id=1&status=1')

3. U('Blog/cate?cate_id=1&status=1')

三种方式是等效的,都是生成Blog控制器的cate操作 并且cate_id1status1的URL地址。

但是不允许使用下面的定义方式来传参数

1. U('Blog/cate/cate_id/1/status/1');

Tp框架查询数据的时候,查询条件支持字符串的形式,也支持表达式形式

自动验证

D()方法,实例化的是子类模型类的对象,如果没有模型再去调用M()方法,实例化总的模型类对象

Validate验证规则:

下次做项目的时候可以使用一下validate验证规则,验证的时候需要建立相应的模型。需要使用create()方法进行form表单的收集的数据

1、静态方式:在模型类里面通过$_validate属性定义验证规则。

无论是什么方式,验证规则的定义是统一的规则,定义格式为:

1. array(

2.      array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),

3.      array(验证字段2,验证规则,错误提示,[验证条件,附加规则,验证时间]),

4.      ......

5. );

举例:

1. namespace Home\Model;

2. use Think\Model;

3. class UserModel extends Model{

4.    protected $_validate= array(

5.      array('verify','require','验证码必须!'), //默认情况下用正则进行验证

6.      array('name','','帐号名称已经存在!',0,'unique',1), // 在新增的时候验证name字段是否唯一

7.      array('value',array(1,2,3),'值的范围不正确!',2,'in'), // 当值不为空的时候判断是否在一个范围内

8.      array('repassword','password','确认密码不正确',0,'confirm'), // 验证确认密码是否和密码一致

9.      array('password','checkPwd','密码格式不正确',0,'function'), // 自定义函数验证密码格式

调用:

1. $User= D("User"); // 实例化User对象

2. if (!$User->create()){

3.      // 如果创建失败 表示验证没有通过 输出错误提示信息

4.      exit($User->getError());

5. }else{

6.      // 验证通过 可以进行其他数据操作

7. }

在模板中输出信息的时候最好使用$data[‘’]的时候,有时候如果使用$data.的形式会报错

所有的模板一定要放在view目录下

 

 

 

 

 

 

 

 

 

 


原创粉丝点击