目录布局
/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
模板继承,extend,block,建议
继承,重写两个概念
出现在模板层面上的。
布局模板(基础模板)
建立布局模板(基础模板)。(基类父类)
在基础布局模板中,使用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!
ThinkModel类,定义在:
M(),获得基础模型单例
定义于框架中,公共函数库的一个函数。
M,用于获取模型类的单例对象的!
该方法执行时,需要当前模型名作为参数(通常模型名,就是表名,采用首字母大写的命名方法)
所说的模型类:M函数,获得是 ThinkModel 模型基础类的对象。
对应的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的跳转
使用控制器的跳转方法完成:
一下两个方法,都定义在基础的控制器类中:
ThinkController
$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的分发类完成:
ThinkDispatcher