ThinkPHP框架

目录布局

/index.php入口文件

/ThinkPHP/框架目录

Conf/

Convention.php 默认(管理)配置

/Public/浏览器可以直接请求的静态资源目录

/Application/应用程序目录

Common/公共模块

Conf/公共配置,对于所有的平台都起作用

Config.php

Runtime/运行时生成的文件

Home/前台

Back/后台

Conf/当前平台配置配置

Controller/控制器

Model/模型

View/视图

配置修改

动作方法名后缀

配置项:action_suffix

默认(管理)配置:

应该修改application/Common/Conf下的配置文件(convention.php):  'ACTION_SUFFIX'=>'Aaction';//操作方法后缀

之所以定义在在Common的配置文件中,表示,不论任何模块内的动作名,都使用Action作为后缀!

 

配置数据库服务器信息

在:application/Common/Conf或者application/Back/Conf

通用或者当前模块的配置文件中,完成对数据库服务器信息的配置。

 

URL后缀

 

模板的使用

{}数据输出

 

__PUBLIC__

替换为Public目录地址!

在模板被编译时,自动替换!

建议在写URL路径时,使用该占位符完成URL路径的定义!

 

<foreach>

属性:

Name=“变量名”

表示:遍历的变量,通常是数组

Item=”变量名”

表示:每当遍历得到一个元素,赋值的变量

例如:

<foreach name="list" item="row">

相当于

Foreach $list as $row

 

模板继承,extendblock,建议

继承,重写两个概念

 

出现在模板层面上的。

布局模板(基础模板)

建立布局模板(基础模板)。(基类父类)

在基础布局模板中,使用block标签,表示该位置可以被重写的。

语法如下:

 

 

子模板(控制器中,display的模板)

使用:

Extend标签,来表示所继承的布局基础模板

 

 

子模板,使用同名的block标签,重写,父模板中同名的block内容:

 

 

继承&重写

模板:子模板继承自布局(基础模板)。(类)

block块:子模板中的block块重写布局(基础模板)的block块。(方法)

 

模板载入,include

Include标签可以完成模板载入

使用file属性,表示对于的模板页!

 

 

布局模板,layout{__CONTENT__},不建议

提供基础的布局模板(类似于模板继承的父模板),在布局模板中,提供一个占位符。__CONTENT__

 

子模板,来使用该布局模板。

采用直接替换机制。

 

 

相当于,只有一个block块的模板继承方案!

 

站在:大多数框架的角度(例如:laravel),流行的模板继承,建议使用模板继承。

模型的使用

PDO

Undefined const PDO::MYSQL_ATTR_INIT_COMMAND

ThinkPHP底层的DAO(数据访问对象),分装PDO来实现的。

要求,开启pdo_mysql支持:

 

 

Apache httpd restart!

 

 

\Think\Model类,定义在:

 

 

M(),获得基础模型单例

定义于框架中,公共函数库的一个函数。

M,用于获取模型类的单例对象的!

 

 

该方法执行时,需要当前模型名作为参数(通常模型名,就是表名,采用首字母大写的命名方法)

 

所说的模型类:M函数,获得是 \Think\Model 模型基础类的对象。

对应的CategoryModel称之为自定义模型类。

 

 

 

使用M函数的原因:框架提供的基础模型类已经足够完成表的常规操作了。

 

 

语法上:

M定义在全局命名空间的。

更合理的语法应该是 \M();

 

 

为什么直接写函数名时OK的?

因为,函数,首先会在当前命名空间查找,如果没有,则会去全局(根)命名空间查找!(这个特性仅仅适用于函数)

 

自定义模型

需要模块的Model目录,创建独立的模型类文件!

 

 

D(),获得自定义模型

使用方法与M()一致,但是会优先尝试实例化自定义模型。

D(“Category”),

先:new CategoryModel

如果自定义模型不存在,则会退而求其次,实例化基础模型:

再:new Model;// M(‘Category’)

 

 

$model->create()创建数据

该方法,用来创建数据(对象),用来将数据关联到当前的模型对象上。

 

测试结果:

Create前:

 

Create后:

 

 

除此之外,create还会执行很多额外的操作:例如:数据验证,自动完成,等!

 

语法上:

Create()方法,应该接受一个关联数组,作为参数。典型情况,数据来源于POST数据,create会自动查找!

 

 

建议:尽可能将表单的form元素的name设置为,数据表字段一致,ThinkPHP自动处理的越多!

额外十分有用的操作

除了将数据与对象关联上之外:还可以执行很多额外的操作:

如图所示:

步骤

说明

返回

1

获取数据源(默认是POST数组)

 

2

验证数据源合法性(非数组或者对象会过滤)

失败则返回false

3

检查字段映射

 

4

判断数据状态(新增或者编辑,指定或者自动判断)

 

5

数据自动验证

失败则返回false

6

表单令牌验证(防止表单重复提交安全选项)

失败则返回false

7

表单数据赋值(过滤非法字段和字符串处理)

 

8

数据自动完成

 

9

生成数据对象(保存在内存)

 

 

字段映射

为了解决,表单中元素的name属性值,与数据表中字段名称对应不上的情况。

Form

Input name=”title”

 

Table

Subject varchar(24)

 

$_POST[‘title’]

 

判断数据状态

判断当前需要执行的是插入,还是更新!

自动判断:90%,依据是否存在主键,判断是否是更新或插入。存在主键则为更新,否则为插入!

认为干预:向$model->create()传参。第二个参数为人为决定的状态,两个值:

Model::MODEL_INSERT

Model::MODEL_UPDATE

 

自动验证,重点

验证数据的合法性。

自动在:

允许用户,自定义验证规则,在调用create时,利用用户定义的规则,完成数据的合法性校验!

操作上的核心:在于定义验证规则。

规则定义在,模型中!

通常,需要通过自定义模型,完成规则的定义:

 

格式如下:

二维数组,每个一维数组元素,就表示一条规则:格式如下:

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

验证字段:

验证规则:

错误提示:

 

 

此时调用create时,该验证规则自动完成!

 

如果规则定义在自定义模型上,则需要使用D()函数来获得自定义模型:

 

 

Create()方法一旦验证失败,返回false。

同时使用模型的getError()方法,返回错误信息。

 

 

验证规则

关于自动验证规则的定义,分两套语法:

常见规则(基本规则)和附加规则(扩展规则)

常见规则:通常使用前三个元素即可即可

附加规则:至少需要使用第五个参数。通常使用第二个参数配合第五个参数使用,第五个参数表示哪种规则,第二个参数表示该规则的选项。

 

常见规则

Require,必须

url,URL

number:数字,相当于int unsigned! 0, 正整数!

 

扩展规则

Length:长度,需要提供长度范围

Unique: 唯一

Regex:正则,需要提供正则表达式

Between:是否在某个范围内,需要范围

Confirm,判断两个字段是否相等。需要比较的元素名。

通过自定义函数(方法)来设置规则:

Function: 函数

Callback:当前模型类方法

 

验证条件

当数据出现那种情况时,才会验证:支持:

三种情况:

存在才验证:0,MODEL::EXISTS_VALIDATE

必须验证,不论是否存在:1,MODEL::MUST_VALIDATE

值不为空时,才验证。2, MODEL::VALUE_VALIDATE

 

多字段验证

默认情况下,不支持多字段验证。一旦检验出来某条规则出错,则自动退出!

 

如果需要将所有的规则都检验出来,再返回错误消息,就应该设置批量验证字段:

 

此时,一旦出错,错误消息就使用数组表示:

每个元素就是错误消息:

字段=>消息

通过拼凑错误消息,可以展示所有内容:

 

 

表单令牌验证

防止表单重复提交安全机制!

表单数据赋值

用于过滤非法字段!

 

数据自动完成,重要

为字段设置默认值,通常使用在插入,或者是自动更新的某些字段上。

例如:update_time 表示更新时间!

 

需要在定义模型上,定义属性:

$_auto; 完成!

 

 

生成数据对象

将数据与模型对象关联!

 

$model->add()

形成insert语句,完成添加!

 

通过模型的fetchSQL方法,获得所拼凑的SQL,用于调试!

 

执行fetchSQL时,不会真正执行insert语句的,用于调试!

 

 

语法上:thinkPHP使用了大量的连贯操作语法形式!

一个对象调用方法后,再调用方法:

$result_add = $m_category->fetchSql(true)->add();

实现:仅仅需要fetchSQL()返回对象即可!

 

最终的返回值为最后一次调用的返回值!

 

$model->add()返回值为:最新生成的自动增长ID!

 

$model->find()查一条

查找一条,通常利用主键查询

 

 

$model->select()查列表

 

$model->where()->order()->limit()->select()

检索符合条件的所有数据

 

 

支持再此之前,通过连贯操作,对查询进行设置。

Select * from table-name where $cond group by $group having $having order by $order limit $offset,$limit;

$model->order()

排序的方法

 

 

$model->delete()

根据条件或者主键进行删除

 

 

如果没有主键,利用条件的话:使用where()作为连贯操作

$cond['id'] = 10;

$m_category->where($cond)->delete();

 

$model->save() 更新

完成更新的操作!

$model->limit($offset, $pagesize)

拼凑select语句的limit部分!

$model->page($page, $pagesize)

对limit 封装,page内,自动算$offset = ($page-1) * $pagesize;

 

$model->count();

用于获符合合条件的记录数

可以通过where连贯操作,提供条件

$model->where()->count();

 

$model->where()

配合:查询,删除,更新来使用

 

$cond

$model->where($cond)->select();

$model->where($cond)->delete();

$model->where($cond)->save();

 

 

其中条件的写法,有两种:

之一:字符串:

Id>10

之二:数组,建议。强烈建议。1,数据安全性更容易被保证。2,其他(牛逼)的框架都这样。

$cond[‘id’] = array(‘gt’, 10);

 

 

写法如下:

典型写法:

$cond['字段名'] = array('表达式','查询条件');

表达式就是运算符:

表达式含义协助记忆

EQ 等于(=) equal

NEQ 不等于(<>) not equal

GT 大于(>) greater than

EGT 大于等于(>=) equal or greater

LT 小于(<) less than

ELT 小于等于(<=) equal or less than

LIKE 模糊查询

[NOT] BETWEEN (不在)区间查询

[NOT] IN (不在)IN 查询

EXP 表达式查询,支持SQL语法expression

 

例如:

空数组:

 

大于:

 

 

 

In

Between

 

 

Like:自动转义!

 

 

多个条件的情况

增加多个元素即可!

 

条件间为:AND 的关系。

 

如果需要修改为OR 逻辑关系,需要使用:

 

 

非单一的逻辑关系,混合的逻辑关系:

_complex(复杂)

 

 

默认的,如果字段对应的是一个具体指,就表示等于关系

$cond[field] = 10;

$cond[field] = array(‘eq’, 10);

 

ThinkPHP的跳转

使用控制器的跳转方法完成:

一下两个方法,都定义在基础的控制器类中:

\Think\Controller

$this->success();

成功后的跳转

需要的参数:为提示信息,和目标URL

 

$this->error();

失败时跳转:

需要的参数:提示信息,和目标URL

 

 

URL处理

基础模式

 

通过get参数,m,c,a表示分发参数!

为了搜索引擎,或者用户,优化URL,更加简洁,更加容易记,更加美观,更加具有逻辑含义。

 

ThinkPHP采用默认的pathinfo的模式,形式使用/分割不同的参数:

 

Pathinfo模式

ThinkPHP默认的URL模式

 

 

URL后缀

在URL上,增加任意的后缀,表示不同的格式:

默认的后缀就是html

可以被配置的:

通过增加配置项:

 

 

\U()

在ThinkPHP中,建议(强烈建议)所有的URL,都使用该函数生成。原因是在ThinkPHP中对对URL存在很多配置:例如,URL模式,URL后缀!

 

U(‘Module/Controller/action’, array(p1=>v1, p2=>v2))

参数一:分发参数

参数二:get参数数组

 

使用函数,可以自动生成符合ThinkPHP规范的URL。

 

 

如果需要在模板中,生成URL,则需要使用:

 

{:U()}

在函数前写 : 表示该位置调用函数的意思!

不仅仅对应于U函数,所有的函数都可以这么调用!

 

 

浏览器输入数据的处理

I()

获取请求数据

I(‘post.key’);

$_POST[‘key’]

I(‘get.key’);

$_GET[‘key’]

I(‘get.key’, ‘default_value’)

Isset($_GET[‘key’]) ? $_GET[key] : ‘default_value’

 

 

 

 

配置系统

C(‘KEY’)

获取KEY对应的配置项的值

 

如果是用户自定义的配置项,需要在配置文件中,定义好才可以!

 

 

分页实现

数据

$model->page()

$model->limit();

 

翻页

利用系统提供的翻页类:

 

 

 

Pathinfo

是URL的一部分。

一个典型的URL如下:

http://blog.hellokang.net:8888/path/to/script.php/module/controller/action/k1/v1/k2/v2.html?p1=v1&p2=v2#tag

协议:http

域名:blog.hellokang.net

端口:8888

脚本路径:/path/to/script.php

pathinfo:/module/controller/action/k1/v1/k2/v2.html

请求参数(查询字符串,query string):p1=v1&p2=v2

锚点:#tag

其中:脚本与查询字符串间的部分称之为pathinfo!

 

任何web程序,都可以获取到pathinfo的:

例如:PHP,

$_SERVER[‘PATH_INFO’];

 

 

ThinkPHP程序中:通过获取到的pathinfo字符串,进行分析,判断当前的分发参数:

由:ThinkPHP的分发类完成:

\Think\Dispatcher

posted @ 2018-03-02 15:29  永杰本杰  阅读(1104)  评论(0编辑  收藏  举报