CI中一个Model中可以操作多个表,但TP只能一个
首先说Model吧:在TP中是一个表对应一个Model,而且普通Model中只是一些自动验证啊,自动完成啊、还有数据字段信息啊一些东西;而CI中的Model则完全不同,一个Model不必约束于一个表,也就是说名字为abc的Model中你也可以查询名字为def的表中的数据,而且可以定义方法完成一些数据查询,比如我可以在名为articles_model的Model中定义一个名字为get_articles的方法来获取所有文章信息,当某个Controller加载了这个Model后,就可以在相应的Controller中用:
$this->articles_model->get_articles();
来方便地获取所有文章信息,而对于TP来说,这些操作只能在Action类中完成,2.0版的TP已经把View、Relation和Adv三个高级查询model库类定为不自动加载了,看了一下手册,感觉除了View视图查询容易用一点,另外两个都不怎么好用,感觉用起来太复杂,还不如用原生的SQL查询.
CI的Model还有一个使我很喜欢的方法就是dbprefix方法,在使用原生的sql查询时使用这个函数使得修改数据库表名前缀后你的代码不需要经过任何改动,在TP中我没有发现类似的函数,当我用TP开发一个博客系统时,发现关联查询很麻烦,于是想用原生的SQL查询,却没有找到自动增加数据库表名前缀的方法,虽然可以自己修改TP的核心库来实现,但是还是觉得这样有点不太好.
真的要感谢TP,如果不是TP,也许我就不会去关注CI了,当我那天看了几页CI的英文文档后,立马就对它产生的深厚的兴趣,于是第二天一起床就开始看CI的手册,虽然是从官网下的英文版的,不过它的手册写得很简洁、很周到,边看边操作,看完手册后我就几乎能熟练使用这个框架了,于是用它开发了一个博客系统。
CI的Model类简单易用,TP的Model类功能相对来说要强大一些,但是用起来个人感觉没有那么方便。
其次,对于View,从功能上讲,TP的View要更加强大一些,选择更多一些,在TP中你可以选择就用PHP作模板引擎,可以就用TP自身的模板引擎,也可以选择用smarty等其它第三方模板引擎,而在CI中就只能用CI内置的功能简单的模板引擎或者用原生的PHP代码作模板,个人觉得用PHP作模板更好一些,一来省去了学习另外的模板引擎语法的麻烦,二来执行效率更高一些,因些从View来讲,选择CI或者是TP都无所谓.
再次是Controller了,在CI中的应用的控制器是继承自核心类Controller的,TP中的控制器则是继承于核心类Action,不过还是有不同的,在TP中,你可以把一些公共的变量或者在多个控制器中都要执行的东西放在一个action里,假如这个action文件为CommonAction.class.php,在它的_initialize方法中可以执行一些在多个控制器中都要执行的代码或者初始化一些多个控制器都要使用的变量,这样,应用的其它action只要继承CommonAction 就可以实现了.
因为框架在加载相应action时首先会自动加载那个CommonAction的,而在CI中就没有这个方便的功能了,但是也可以自己写一个library,在该library类的__construct方法里放一些代码,然后在每个控制器中都加载这个library,这样也可以实现像TP一样的功能,不过相对来说麻烦了一些,TP还有一点比较灵活的就是,在这个控制器(action)里面可以执行那个控制器中的函数(比如用A或者R函数来实现),在CI中则不行,你不能在这个控制器中执行那个控制器中的函数,还有就是TP可以定义一个名为EmptyAction的控制器,当所有控制器都找不到时,就调用这个Empty控制器。
这一点如果与empty方法配合,可以使得URL大大缩减,虽然CI和TP都支持空操作,不过这二者的空操作名称不相同,实现的优先级也不相同,在TP中的空操作(_empty方法)优先级是最低的,也就是说当当前控制器的所有操作都找不到时才调用这个空操作;在CI中则恰恰相反,只要存在空操作(_remap方法),该控制器的其它的操作都没用了(不能访问了)
初学CI框架遇到的一些问题,与Thinkphp框架对比的不同之处。
system 是框架核心
application 是项目目录
index.php 是项目入口文件
其他目录可以删除
控制器命名规则
控制器不加 Controller 后缀,
如 user.php 这就是一个控制器
修改默认控制器和方法
默认控制器是welcome.php,不喜欢可以改掉。
修改方法如下:
在 config/routes.php 中
$route[‘default_controller’] = ‘welcome’;
改为
$route[‘default_controller’] = ‘index/home’;
为什么不该成“index/index”呢???
因为CI中的控制器命名中没有后缀,所以index类的index方法会默认为析构方法__construct();
所以不可以这样搞,如果改成”index/index”则index方法会被调用两次。
加载视图文件
$this->load->view(‘index/home’);
这个视图文件放在/application/view/index/home.php
看到这个文件的后缀了吗?它是一个php文件,不是html文件
在CI中 view() 方法可以使用多次,也就是可以加载多个模板
可以这样写:
1.在 /application/view/index目录下有这样几个模板文件
header.php
main.php
footer.php
2.在index控制器的home方法中
public function home(){
//按顺序加载模板文件
this−>load−>view(‘index/header′);
this->load->view(‘index/main’);
$this->load->view(‘index/footer’);
}
给模板分配变量
CI框架中的模板是直接写php代码的,如分配一个hello的变量:
$this->load->vars(‘hello’,’heheheh’);
在模板中直接写