学习ThinkPHP笔记
TP的模块化设计
名称 | 描述 |
---|---|
应用 | 基于同一个入口文件访问的项目我们称之为一个应用。 |
模块 | 一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录。 |
控制器 | 每个模块可以包含多个控制器,一个控制器通常体现为一个控制器类。 |
操作 | 每个控制器类可以包含多个操作方法,也可能是绑定的某个操作类,每个操作是URL访问的最小单元 |
ThinkPHP的应用目录
URL模式
URL模式 | URL_MODEL设置 |
---|---|
普通模式 | 0 |
PATHINFO模式 | 1 |
REWRITE模式 | 2 |
兼容模式 | 3 |
1.普通模式
http://localhost/?m=home&c=user&a=login&var=value
m参数表示模块,c参数表示控制器,a参数表示操作(当然这些参数都是可以配置的),后面的表示其他GET参数
2.PATHINFO模式
http://localhost/index.php/home/user/login/var/value/
PATHINFO地址的前三个参数分别表示模块/控制器/操作。
// 更改PATHINFO参数分隔符
'URL_PATHINFO_DEPR'=>'-',
前置和后置操作
类似高级语言面向对象中的构造函数(前置)与析构函数(后置)
系统会检测当前操作是否具有前置和后置操作,如果存在就会按照顺序执行,前置和后置操作的定义方式如下:
class IndexController extends Controller{
//前置操作方法
public function _before_index(){
echo 'before<br/>';
}
public function index(){
echo 'index<br/>';
}
//后置操作方法
public function _after_index(){
echo 'after<br/>';
}
}
需要注意的是,在有些方法里面使用了exit或者错误输出之类的话,有可能不会会再执行后置方法了。例如,如果在当前操作里面调用了控制器类的error方法,那么将不会再执行后置操作,但是不影响success方法的后置方法执行。
success和error方法
一般形式:success($message,$error,$waitSecond)
或error($message,$error,$waitSecond)
变量 | 含义 |
---|---|
$message | 页面提示信息 |
$error | 页面错误提示信息 |
$waitSecond | 跳转等待时间 单位为秒 |
$jumpUrl | 跳转页面地址 |
例:
public function showid($id=0){
if($id===0){
$this->error('操作失败','./Index/index',1);
}
else echo "This is PostController's showid method!The ID is ".$id.".";
}
默认的等待时间success方法是1秒,error方法是3秒
重定向
Controller类的redirect方法可以实现页面的重定向功能。
redirect方法的参数用法和U函数的用法一致(参考URL生成部分),例如:
//重定向到New模块的Category操作
$this->redirect('New/category', array('cate_id' => 2), 5, '页面跳转中...');
如果你仅仅是想重定向要一个指定的URL地址,而不是到某个模块的操作方法,可以直接使用redirect函数重定向,例如:
//重定向到指定的URL地址
redirect('/New/category/cate_id/2', 5, '页面跳转中...')//Redirect函数的第一个参数是一个URL地址。
控制器的redirect方法和redirect函数的区别在于前者是用URL规则定义跳转地址,后者是一个纯粹的URL地址。
请求类型
常量 | 说明 |
---|---|
IS_GET | 判断是否是GET方式提交 |
IS_POST | 判断是否是POST方式提交 |
IS_PUT | 判断是否是PUT方式提交 |
IS_DELETE | 判断是否是DELETE方式提交 |
IS_AJAX | 判断是否是AJAX提交 |
REQUEST_METHOD | 当前提交类型 |
连贯操作(数据库操作)
系统支持的连贯操作方法有:
连贯操作 | 作用 | 支持的参数类型 |
---|---|---|
where* | 用于查询或者更新条件的定义 | 字符串、数组和对象 |
table | 用于定义要操作的数据表名称 | 字符串和数组 |
alias | 用于给当前数据表定义别名 | 字符串 |
data | 用于新增或者更新数据之前的数据对象赋值 | 数组和对象 |
field | 用于定义要查询的字段(支持字段排除) | 字符串和数组 |
order | 用于对结果排序 | 字符串和数组 |
limit | 用于限制查询结果数量 | 字符串和数字 |
page | 用于查询分页(内部会转换成limit) | 字符串和数字 |
group | 用于对查询的group支持 | 字符串 |
having | 用于对查询的having支持 | 字符串 |
join* | 用于对查询的join支持 | 字符串和数组 |
union* | 用于对查询的union支持 | 字符串、数组和对象 |
distinct | 用于查询的distinct支持 | 布尔值 |
lock | 用于数据库的锁机制 | 布尔值 |
cache | 用于查询缓存支持 | 多个参数 |
relation | 用于关联查询(需要关联模型支持) | 字符串 |
result | 用于返回数据转换 | 字符串 |
validate | 用于数据自动验证 | 数组 |
auto | 用于数据自动完成 | 数组 |
filter | 用于数据过滤 | 字符串 |
scope* | 用于命名范围 | 字符串、数组 |
bind* | 用于数据绑定操作 | 数组或多个参数 |
token | 用于令牌验证 | 布尔值 |
comment | 用于SQL注释 | 字符串 |
index | 用于数据集的强制索引(3.2.3新增) | 字符串 |
strict | 用于数据入库的严格检测(3.2.3新增) | 布尔值 |
所有的连贯操作都返回当前的模型实例对象(this),其中带*标识的表示支持多次调用。
where
字符串
$User = M("User"); // 实例化User对象
$User->where('type=1 AND status=1')->select();
相当于:
SELECT * FROM think_user WHERE type=1 AND status=1
数组
1.普通查询
$User = M("User"); // 实例化User对象
$map['name'] = 'thinkphp';
$map['status'] = 1;
// 把查询条件传入查询方法
$User->where($map)->select();
相当于:
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
**2.表达式查询**
一般形式:
```php
$map['字段1'] = array('表达式','查询条件1');
$map['字段2'] = array('表达式','查询条件2');
$Model->where($map)->select(); // 也支持
支持的表达式有:
表达式 | 含义 |
---|---|
EQ | 等于(=) |
NEQ | 不等于(<>) |
GT | 大于(>) |
EGT | 大于等于(>=) |
LT | 小于(<) |
ELT | 小于等于(<=) |
LIKE | 模糊查询 |
[NOT] BETWEEN | (不在)区间查询 |
[NOT] IN | (不在)IN 查询 |
EXP | 表达式查询,支持SQL语法 |
3.多次调用
$map['a'] = array('gt',1);
$where['b'] = 1;
$Model->where($map)->where($where)->where('status=1')->select();
命名范围
就是_scope 属性定义和scope 连贯操作方法的使用
定义_scope属性:
namespace Home\Model;
use Think\Model;
class NewsModel extends Model {
protected $_scope = array(
// 默认的命名范围
'default'=>array(
'where'=>array('status'=>1),
'limit'=>10,
),
// 命名范围normal
'normal'=>array(
'where'=>array('status'=>1),
),
// 命名范围latest
'latest'=>array(
'order'=>'create_time DESC',
'limit'=>10,
),
);
}
其实命名范围就是事先把常用的查询条件储存起来,之后方便直接调用。
$Model = D('News'); // 这里必须使用D方法 因为命名范围在模型里面定义
$Model->scope('normal')->select();
$Model->scope('latest')->select();
$Model->scope()->select();//调用默认命名范围
相当于:
SELECT * FROM think_news WHERE status=1
SELECT * FROM think_news ORDER BY create_time DESC LIMIT 10
支持多次调用
$Model->scope('normal')->scope('latest')->select();
//相当于
$Model->scope('normal,latest')->select();
CURD操作
数据库操作的四个基本操作(CURD):创建(Create)、更新(Update)、读取(Read)和删除(Delete)
Tips
- add()方法--数据写入(相当于sql中的Insert)
- find()方法--读取数据表中的一行数据(或者关联数据)
- select()方法--获取数据表中的多行记录(以及关联数据)
- save()方法--更新数据(相当于sql中的Update)
- delete()方法--删除数据使用(相当于sql中的Drop)
ActiveRecord
使用方便和便于理解(采用了对象化)
ThinkPHP实现了ActiveRecords模式的ORM模型,采用了非标准的ORM模型:表映射到类,记录映射到
对象
示例:插入数据
$User = M("User"); // 实例化User对象
// 然后直接给数据对象赋值
$User->name = 'ThinkPHP';
$User->email = 'ThinkPHP@gmail.com';
// 把数据对象添加到数据库
$User->add();
极大地简化了操作!!!
根据主键查询
$User = M("User"); // 实例化User对象
// 查找id为8的用户数据
$User->where('id=8')->find();
//相当于
$User->find(8);
// 查找主键为1、3、8的多个数据
$userList = $User->select('1,3,8');
根据某个字段查询
$User = M("User"); // 实例化User对象
$User->getByName("ThinkPHP");
更新记录
$User->find(1); // 查找主键为1的数据
$User->name = 'TOPThink'; // 修改数据对象
$User->save(); // 保存当前数据对象
删除记录
$User->find(2);
$User->delete(); // 删除当前的数据对象
$User->delete(8); // 删除主键为8的数据
$User->delete('5,6'); // 删除主键为5、6的多个数据
内置标签
标签名 | 作用 | 包含属性 |
---|---|---|
include | 包含外部模板文件(闭合) | file |
import | 导入资源文件(闭合 包括js css load别名) | file,href,type,value,basepath |
volist | 循环数组数据输出 | name,id,offset,length,key,mod |
foreach | 数组或对象遍历输出 | name,item,key |
for | For循环数据输出 | name,from,to,before,step |
switch | 分支判断输出 | name |
case | 分支判断输出(必须和switch配套使用) | value,break |
default | 默认情况输出(闭合 必须和switch配套使用) | 无 |
compare | 比较输出(包括eq neq lt gt egt elt heq nheq等别名) | name,value,type |
range | 范围判断输出(包括in notin between notbetween别名) | name,value,type |
present | 判断是否赋值 | name |
notpresent | 判断是否尚未赋值 | name |
empty | 判断数据是否为空 | name |
notempty | 判断数据是否不为空 | name |
defined | 判断常量是否定义 | name |
notdefined | 判断常量是否未定义 | name |
define | 常量定义(闭合) | name,value |
assign | 变量赋值(闭合) | name,value |
if | 条件判断输出 | condition |
elseif | 条件判断输出(闭合 必须和if标签配套使用) | condition |
else | 条件不成立输出(闭合 可用于其他标签) | 无 |
php | 使用php代码 | 无 |
日志记录
默认情况下只是在调试模式记录日志,要在部署模式开启日志记录,必须在配置中开启LOG_RECORD 参数,以及可以在应用配置文件中配置需要记录的日志级别
手动记录
方法 | 描述 |
---|---|
Log::record() | 记录日志信息到内存 |
Log::save() | 把保存在内存中的日志信息(用指定的记录方式)写入 |
Log::write() | 实时写入一条日志信息 |
表单合法性检测
配置insertFields 和 updateFields属性
定义后,调用add方法写入用户数据的时候,只能写入'account','password','nickname','email' 这几个字段,编辑的时候只能更新'nickname','email' 两个字段
namespace Home\Model;
class UserModel extends \Think\Model{
protected $insertFields = array('account','password','nickname','email');
protected $updateFields = array('nickname','email');
}
配合field方法使用
//新增用户数据
M('User')->field('account,password,nickname,email')->create();
//更新用户数据
M('User')->field('nickname,email')->create();
assign方法--模板赋值
assign方法必须在display和show方法之前调用,并且系统只会输出设定的变量,其它变量不会输出(系统变量例外),一定程度上保证了变量的安全性。
$array['name'] = 'thinkphp';
$array['email'] = 'liu21st@gmail.com';
$array['phone'] = '12335678';
$this->assign($array);
display方法--渲染模板
dump()方法
内置用于打印的函数
一般形式:dump($var, $echo=true, $label=null, $strict=true)
参数 | 描述 |
---|---|
var(必须) | 要输出的变量,支持所有变量类型 |
echo(可选) | 是否直接输出,默认为true,如果为false则返回但不输出 |
label(可选) | 变量输出的label标识,默认为空 |
strict(可选) | 输出变量类型,默认为true,如果为false则采用print_r输出 |
A方法
默认情况下,A方法实例化的是默认控制器层(Controller),如果你要实例化其他的分层控制器的话,可以使用:
// 假设当前模块是Home模块
// 实例化Event控制器
$User = A('User','Event');
$Blog = A('Admin/Blog','Event');
上面的代码等效于:
// 实例化Home模块的User事件控制器
$User = new \Home\Event\UserEvent();
// 实例化Admin模块的Blog事件控制器
$Blog = new \Admin\Event\BlogEvent();
C方法
无论何种配置文件,定义了配置文件之后,都统一使用系统提供的C方法(Config)来读取已有的配置。用法:C('参数名称')
例如,读取当前的URL模式配置参数:
$model = C('URL_MODEL');
还可以利用C方法对某些参数进行动态配置(或者增加新的配置),主要是指那些还没有被使用的参数。设置格式:C('参数名称','新的参数值')
// 动态改变缓存有效期
C('DATA_CACHE_TIME',60);
D方法
用于数据模型的实例化操作,实例化某个具体的模型类
D('User') //实例化UserModel
D('User','Logic') //实例化UserLogic
D('User','Service') //实例化UserService
例:
//实例化模型
$User = D('User');
// 相当于 $User = new \Home\Model\UserModel();
// 执行具体的数据操作
$User->select();
E方法
手动抛出异常
E('新增失败');
E('信息录入错误',25);
F方法--快速缓存
F方法可以支持不同的存储类型,如果是文件类型的话,默认保存在DATA_PATH目录下面
//快速缓存Data数据
F('data',$Data);
//保存到指定的目录
F('data',$Data,TEMP_PATH);
//获取缓存数据
$Data = F('data');
//删除缓存数据
F('data',NULL);
I方法
I方法是ThinkPHP用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:
I('变量类型.变量名/修饰符',['默认值'],['过滤方法或正则'],['额外数据源'])
//以GET变量类型为例
echo I('get.id'); // 相当于 $_GET['id']
echo I('get.name'); // 相当于 $_GET['name']
变量类型是指请求方式或者输入类型,包括:
变量类型 | 含义 |
---|---|
get | 获取GET参数 |
post | 获取POST参数 |
param | 自动判断请求类型获取GET、POST或者PUT参数 |
request | 获取REQUEST 参数 |
put | 获取PUT 参数 |
session | 获取 $_SESSION 参数 |
cookie | 获取 $_COOKIE 参数 |
server | 获取 $_SERVER 参数 |
globals | 获取 $GLOBALS参数 |
path | 获取 PATHINFO模式的URL参数 |
data | 获取 其他类型的参数,需要配合额外数据源参数 |
I方法的第三个参数如果传入函数名,则表示调用该函数对变量进行过滤并返回,例:
I('post.email','',FILTER_VALIDATE_EMAIL)
//表示 会对$_POST['email'] 进行 格式验证,如果不符合要求的话,返回空字符串。
新版本中,I函数对变量使用修饰符功能,可以更方便的通过类型过滤变量
I('变量类型.变量名/修饰符')
修饰符 | 作用 |
---|---|
s | 强制转换为字符串类型 |
d | 强制转换为整型类型 |
b | 强制转换为布尔类型 |
a | 强制转换为数组类型 |
f | 强制转换为浮点类型 |
例:
I('get.id/d'); // 强制变量转换为整型
I('post.name/s'); // 强制转换变量为字符串类型
I('post.ids/a'); // 强制变量转换为数组类型
M方法
使用M方法实例化,对数据表进行基本的CURD操作,由于不需要加载具体的模型类,所以性能会更高。
用法同D方法
S方法
系统内置对缓存操作
缓存初始化:S(array('type'=>'xcache','expire'=>60));
常用的参数是:
参数 | 描述 |
---|---|
expire | 缓存有效期(时间为秒) |
prefix | 缓存标识前缀 |
type | 缓存类型 |
支持的缓存类型包括:
Apachenote
、Apc
、Db
、Eaccelerator
、File
、Memcache
、Redis
、Shmop
、Sqlite
、Wincache
和Xcache
缓存设置
// 设置缓存
S('name',$value);
// 缓存数据300秒
S('name',$value,300);
// 采用文件方式缓存数据300秒
S('name',$value,array('type'=>'file','expire'=>300));
// 读取缓存
$value = S('name');
// 删除缓存
S('name',null);
U方法
用于URL的动态生成
U方法的定义规则如下(方括号内参数根据实际应用决定):
U('地址表达式',['参数'],['伪静态后缀'],['显示域名'])
地址表达式:[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...
W方法
在模版中调用Widget:{:W('Cate/Menu')}
常用Config配置项
'DEFAULT_CONTROLLER' => 'User',//默认的控制器
'show_page_trace'=>false,//是否显示页面追踪
'URL_CASE_INSENSITIVE' =>truev,//不区分URL大小写
'ACTION_SUFFIX' => 'Action', // 操作方法后缀
'CONTROLLER_LEVEL' => 2,//设置2级目录的控制器层
'URL_PARAMS_BIND_TYPE' => 1, // 设置参数绑定按照变量顺序绑定
'URL_PARAMS_BIND' => false,//关闭参数绑定功能
'URL_HTML_SUFFIX' => 'html|shtml|xml',// 多个伪静态后缀设置 用|分割
'DEFAULT_FILTER' => 'strip_tags,htmlspecialchars',//默认的过滤器
'DB_FIELDS_CACHE'=>false,// 关闭字段缓存
'DEFAULT_V_LAYER' =>'Template', // 设置默认的视图层名称,默认为View
'TMPL_TEMPLATE_SUFFIX'=>'.tpl',//配置视图的后缀,默认为.html
define('TMPL_PATH','./Template/'),//改变所有模块的模板目录
'VIEW_PATH'=>'./Theme/',//改变某个模块的模板文件目录
DEFAULT_THEME' => 'default',// 设置默认的模板主题
'SHOW_ERROR_MSG' => true, // 显示错误信息
'SHOW_ERROR_MSG' => false,'ERROR_MESSAGE' => '发生错误!',//设置统一的错误提示信息
'ERROR_PAGE' =>'/Public/error.html',//所有异常和错误都指向一个统一页面
'TMPL_EXCEPTION_FILE' => APP_PATH.'/Public/exception.tpl'//修改系统默认的异常模板文件
'LOG_RECORD' => true, // 开启日志记录
'LOG_LEVEL' =>'EMERG,ALERT,CRIT,ERR', // 只记录EMERG ALERT CRIT ERR 错误
'TMPL_PARSE_STRING' => array(
'__STATIC__' => __ROOT__.'/Application/'.MODULE_NAME.'/View/' . '/Public/static',)
链接:http://www.jianshu.com/p/b5c1084f096a
來源:简书