博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

学习ThinkPHP笔记

Posted on 2017-12-06 10:47  艾特水煮鱼  阅读(335)  评论(0编辑  收藏  举报

学习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
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 缓存类型

支持的缓存类型包括:
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',)


链接:http://www.jianshu.com/p/b5c1084f096a
來源:简书