学习ThinkPHP笔记

 
 

TP的模块化设计

名称描述
应用基于同一个入口文件访问的项目我们称之为一个应用。
模块一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录。
控制器每个模块可以包含多个控制器,一个控制器通常体现为一个控制器类。
操作每个控制器类可以包含多个操作方法,也可能是绑定的某个操作类,每个操作是URL访问的最小单元

ThinkPHP的应用目录

应用整体架构.JPG
模块内部架构.JPG

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

  1. add()方法--数据写入(相当于sql中的Insert)
  2. find()方法--读取数据表中的一行数据(或者关联数据)
  3. select()方法--获取数据表中的多行记录(以及关联数据)
  4. save()方法--更新数据(相当于sql中的Update)
  5. 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
forFor循环数据输出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缓存类型

支持的缓存类型包括:
ApachenoteApcDbEacceleratorFileMemcacheRedisShmopSqliteWincacheXcache

缓存设置

// 设置缓存
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',)


作者:CoderAaron
链接:http://www.jianshu.com/p/b5c1084f096a
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值