第3章 ThinkPHP 和 CodeIgniter在应用中比较
ThinkPHP并没有表单验证的函数,但是在ThinkPHP的Model里,有对字段的验证,放在下一章节讨论.下图是CodeIgniter的表单
图3.13 CodeIgniter测试表单
源代码为
可以看到,只是base_url()函数被替换成地址外,其他的并没有什么改动.我们提交\
页面中只显示了一行,并没有其他附加的东西. array(1) { [\ 接下来,我们将post改为get后,结果是一样的.
既然ThinkPHP和CodeIgniter的结果类似,我为什么还拿出来比较呢,因为还有一点没有测试.
我们在浏览器地址栏中输入
http://127.0.0.1/TPCI/TP/index.php/Index/test/name/HelloWorld 会看到浏览器输出 array(2) {
[\ [\ [0] => string(5) \ [1] => string(4) \ [2] => string(4) \
[3] => string(10) \ } }
这是ThinkPHP的结果,那么输入
http://127.0.0.1/TPCI/CI/index.php/Index/test/name/HelloWorld 浏览器出输出array(0) { } ,没有结果.
这边是ThinkPHP和CodeIgniter在地址解析方面的区别.
CodeIgniter则在URL上没有这么多选择,只有一个启用查询字符串,使用浏览器常规的显示方法,即ThinkPHP的 URL_MODEL 0.其他的则有 添加任意后缀(为了网站安全考虑)等小的功能,无法和ThinkPHP强大的URL路由相比.
但是CodeIgniter的控制器里可以添加参数,将CodeIgniter控制器index.php的test方法改为
24
第3章 ThinkPHP 和 CodeIgniter在应用中比较
public function test($name){ echo $name; }
然后再浏览器中浏览
http://127.0.0.1/TPCI/CI/index.php/Index/test/HelloWorld
会发现,浏览器打印出\通过实验可以知道,$name赋值为
\中,可以吧URL的一部分,转换问方法的参数,而ThinkPHP则没有这个功能.
3.5 Model的使用
ThinkPHP和CodeIgniter比较大的一个区别就是Model的使用,对于其相似的类型设置,因为只是部分不一样,其效果是一样的,不在讨论范围,下文只对其中区别较大的地方做讨论.
3.5.1 ThinkPHP的Model
ThinkPHP模型类一般位于项目的Lib/Model 目录下面,当我们创建一个UserModel类的时候,其实已经遵循了系统的约定。模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型类的后缀定义Model,以UserModel为例
表3.2 ThinkPHP Model类 模型名(类名) 约定对应数据表(假设数据库的前缀定义think_) UserModel think_user UserTypeModel think_user_type 如果你的规则和上面的系统约定不符合,那么需要设置Model类的数据表名称属性。
在ThinkPHP的模型里面,有两个关于数据表名称的属性定义:
表3.3 ThinkPHP数据库表明属性定义 tableName 不包含表前缀的数据表名称,一般情况下默认和模型名称相同,只有当你的表名和当前的模型类的名称不同的时候才需要定义。 trueTableName 包含前缀的数据表名称,也就是数据库中的实际表名,该名称无需设置,只有当上面的规则都不适用的情况或者特殊情况下才需要设置。 dbName 定义模型当前对应的数据库名称,只有当你当前的模型类对应的数据库名称和配置文件不同的时候才需要定义。 ThinkPHP的命名规则十分严格,大小写的限制也很严谨,如果不遵守默认原则,除了要修改一些配置文件外,就会出错.
在使用Model的时候有许多方法,在UserAction中使用\方法,或者\
25
第3章 ThinkPHP 和 CodeIgniter在应用中比较
Model('user')\实例化Model,同时还有一个D方法,D方法会自动判断,并且会提供一些M方法没有的函数供使用.同时空的Model,即\或者\里 可以使用原生Sql语句查询.
ThinkPHP里Model有两个属性十分有意思,一个是$_validate属性,还有一个是$_auto 属性,这两个属性分别对应的是自动验证,和自动完成
自动验证中,类型检查只是针对数据库级别的验证,所以系统还内置了数据对象的自动验证功能来完成模型的业务规则验证,而大多数情况下面,数据对象是由表单提交的$_POST数据创建。需要使用系统的自动验证功能,只需要在Model类里面定义$_validate属性,是由多个验证因子组成的二维数组。
示例:
protected $_validate = array(
array('verify','require','验证码必须!'), //默认情况下用正则进行验证
array('name','','帐号名称已经存在!',0,'unique',1), // 在新增的时候验证name字段是否唯一
array('value',array(1,2,3),'值的范围不正确!',2,'in'), // 当值不为空的时候判断是否在一个范围内
array('repassword','password','确认密码不正确',0,'confirm'), // 验证确认密码是否和密码一致
array('password','checkPwd','密码格式不正确',0,'function'), // 自定义函数验证密码格式
);
当使用系统的create方法创建数据对象的时候会自动进行数据验证操作,代码示例: $User = D(\实例化User对象 if (!$User->create()){
// 如果创建失败 表示验证没有通过 输出错误提示信息 exit($User->getError()); }else{
// 验证通过 可以进行其他数据操作 }
通常来说,每个数据表对应的验证规则是相对固定的,但是有些特殊的情况下面可能会改变验证规则,我们可以动态的改变验证规则来满足不同条件下面的验证:
$User = D(\实例化User对象 $validate = array(
array('verify','require','验证码必须!'), // 仅仅需要进行验证码的验证 );
$User-> setProperty(\$result = $User->create(); if (!$result){
// 如果创建失败 表示验证没有通过 输出错误提示信息 exit($User->getError()); }else{
// 验证通过 可以进行其他数据操作 }
同时ThinkPHP也支持批量验证功能,只需要在模型类里面设置patchValidate属性
26
第3章 ThinkPHP 和 CodeIgniter在应用中比较
为true( 默认为false),设置批处理验证后,getError() 方法返回的错误信息是一个数组,返回格式是:
array(\字段名1\错误提示1\字段名2\错误提示2\前端可以根据需要需要自行处理。
如果系统提供的规则不满足要求,可以使用手动验证,新版增加了一个check方法,用于个别需要的情况手动验证数据,支持部分自动验证的规则,用法如下:
check('验证数据','验证规则','验证类型')
验证类型支持 in between equal length regex expire ip_allow ip_deny,默认为regex 结果返回布尔值 $model->check($value,'email'); $model->check($value,'1,2,3','in');[1]
3.5.2 CodeIgniter的Model
CodeIgniter的模型建立和ThinkPHP的有一定区别,在CodeIgniter中,事务是建立在Model中的,而ThinkPHP没有强调这一点,致使事务的操作许多人都写在了Action中,使得MVC并不标准.同时CodeIgniter的Model类使用更贴近原生PHP,在继承CI_Model类后,要先构造父类之后再写自己的函数.更多的是符合PHP语法,而ThinkPHP的封装很多,脱离了PHP的一些语法.
下面介绍CodeIgniter的Model使用,仍然使用UserModel为例,但是在CodeIgniter里,Model文件建在application\\models下,类名首字母大写并继承模型类,文件名是类名的小写版即可,而不用再像ThinkPHP一样添加class后缀.
application/models/usermodel.php 文件内容
class Usermodel extends CI_Model { function __construct() { parent::__construct();//构造父类 } }
如果需要使用数据库函数,则要在构造函数里写入$this->load->database();这样就可以使用CodeIgniter的一些特有的数据库操作
在Usermodel类里可以编写例如 insert(), updata()一些函数,还有一些特殊的查询操作,之后再controllers 直接使用方法即可,同时在controllers里,需要导入Usermodel类才能使用Usermodel类的操作
$this->load->model('usermodel');
这样就可以通过$this->usermodel->insert() 来使用自定义的数据库操作方法.
27
第4章 特性比较
第4章 特性比较
4.1 编译与非编译型
ThinkPHP是编译型PHP框架,他的模板引擎非常出色,在网站在第一次执行的时候,或者网页第一次打开,框架会对项目文件进行编译,编译后的文件放在项目目录下的runtime/Cache文件夹下,以乱码命名,在使用中知道,ThinkPHP的视图(模板)文件时以html结尾,并且基本都是通过使用ThinkPHP提供的内置标签进行操作,比如
我们在index.html模板里编辑如下
此处用的是ThinkPHP的
$data=array(array(\ $this->assign('data',$data); $this->display(); } }
在模板里打印$data的内容. 在浏览器里可以看到显示效果
图3.14 ThinkPHP视图数据测试
在编译后的文件里打开查看文件内容
$vo): ?>--
28