第3章 ThinkPHP 和 CodeIgniter在应用中比较
图3.11 CodeIgniter主页URL形式3
路径的形式和ThinkPHP类似,index.php是入口文件,以后的所有操作都是在
index.php之后完成的,但是可以对Apache 服务器进行操作使其将index.php隐藏,在网站根目录下建立\文件,由于Apache是在Linux下诞生的,文件的形式是Linux下的隐藏文件,以\开头,没有扩展名.在这个文件里用文本编辑器打开输入如下内容后即可,要求Apache服务器打开 rewrite模块
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
在CodeIgniter框架里application文件夹下的config文件夹下包含了项目的配置文件,其中有routes.php的配置文件,里面有两个项目,一个就是主页的设置,默认为welcome,我们在以后的使用中,将其改为index,还有一个是404错误页面的自定义,我们默认为空.
$route['default_controller'] = \$route['404_override'] = '';
按照使用习惯,我们把默认路由改为index.也就是$route['default_controller'] = \同时在view文件夹下建立index.php的视图文件,这一点和ThinkPHP有很大不同,这和CodeIgniter不是编译型框架有很大关系,CodeIgniter的框架视图里,可以随时使用原生PHP语法,当然ThinkPHP也是可以的,但是ThinkPHP的视图(模板)里,要用到ThinkPHP提供的大量标签,比如
建立index.php视图后,通过浏览器并不能直接浏览,因为CodeIgniter也符合MVC规范,需要在controallers里建立index.php的控制器.在默认的welcome.php控制器里,我们已经可以看到,默认类之前给出一句话
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
这是为了防止跨网站攻击用的,而在ThinkPHP里是没有的,还是因为ThinkPHP是编译型框架,在编译过程中,已经为每个网页里添加了一句放跨站攻击的语句,这句话可以再ThinkPHP项目目录下的runtime文件夹下的Cache文件夹下的任意一缓存(编译后的)文件里找到这样一句话
19
第3章 ThinkPHP 和 CodeIgniter在应用中比较
if (!defined('THINK_PATH')) exit();
这也是放跨站攻击,THINK_PATH会在项目里定义,如果没定义,说明非本网站请求,给予拒绝.
说到放跨站攻击机制,CodeIgniter在每个目录下,都建立一个index.html的文件,如果有非正常请求,会在浏览器端显示index.html内容\
与ThinkPHP类似,在index.php的控制器里编辑index类 class Index extends CI_Controller { public function __construct() {
parent::__construct(); }
public function index() {
echo \
$this->load->view('index');
} }
在自定义index类继承CI_Controller的类之后,还要对父类进行构造,否则无法加载CodeIgniter的函数库.修改后,输入相应地址,我们发现,由于我们新建立的index.php视图文件是空的,但符合了规则.浏览器中输出了\这也说明了,在controller里,仍然可以向浏览器输出数据,这和ThinkPHP是类似的.但是CodeIgniter的控制器和视图(view)的数据传送和ThinkPHP有些不同.
在CodeIgniter里,我们要先把数据复制到$data数组里,之后将$data数组导入到视图,但是视图中并不存在$data变量,而存在$data变量里键名为变量名的变量.所以我们将\复制给\之后将$data导入到视图
public function index() {
$data[\ $this->load->view('index',$data); }
同时,在新建立的view index.php中,编辑简单的一句话来打印变量 =$hello?>
这样,我们刷新页面发现,\被打印了出来.
在这个方面,CodeIgniter和ThinkPHP倒是有类似的地方,区别并不是太大.
3.4 $_POST 和 $_GET方法
在表单应用中,CodeIgniter可以利用它自有的函数库,建立表单,在本论文中不讨论,我将在CodeIgniter和ThinkPHP 两个项目视图中建立两个相同的表单,并提交到index
20
第3章 ThinkPHP 和 CodeIgniter在应用中比较
输出观察结果从而讨论区别.
在IndexAction类中加入test()方法 class IndexAction extends Action { public function index(){ $this->display(); }
public function test(){ dump($_POST); } }
在test方法里,接收POST变量,打印出$_POST数组,这里用了ThinkPHP的一个dump()函数,与var_dump()类似.
下面是而对应的ThinkPHP的表单代码
__APP__为ThinkPHP的项目路径.
在CodeIgniter对应的index.php的控制器类添加test()方法 class Index extends CI_Controller { public function __construct() {
parent::__construct();
$this->load->helper(\ }
public function index() {
$this->load->view('index'); }
public function test(){ var_dump($_POST); } }
为了方便操作,在测试中,使用了CodeIgniter的函数库,\使其可以使用\函数,方便在view中路径的编辑.
下面是CodeIgniter的表单代码
方法和表单都设置好后,我们开始进行测试.
3.4.1 ThinkPHP 的表单
ThinkPHP的表单值得一提的是,它为每一个表单都默认加了一个hash,防止表单的
21
第3章 ThinkPHP 和 CodeIgniter在应用中比较
重复过多提交,但是这个强硬的加入易导致一些问题,比如用Javascript 增加表单时,就会因为双引号问题而无法使用,唯一一个解决办法就是取消hash,在ThinkPHP的配置文件里面设置.由于本次试验不涉及JS内容,所以没有取消hash规则
图3.12 ThinkPHP测试表单
网页源代码为
可以看出ThinkPHP已经自动为表单添加了__hash__隐藏变量. 那么输入\并提交后,页面显示 array(2) {
[\ [\
\
}
已经提交过来,并正常显示.
将表单的提交形式改为 \在控制器中也将\改为\再进行测试后,页面显示
array(3) {
[\ [\
\
[\ [0] => string(5) \ [1] => string(4) \ } }
除了我们之前说的\外,有多了一个\数组,另外在URL解析上,ThinkPHP也有其独特之处.
ThinkPHP框架基于模块和操作的方式进行访问,由于ThinkPHP框架的应用采用单一入口文件来执行,因此网站的所有的模块和操作都通过URL的参数来访问和执行。这样一来,传统方式的文件入口访问会变成由URL的参数来统一解析和调度。
ThinkPHP支持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式、PATHINFO、REWRITE和兼容模式。
一、普通模式:设置URL_MODEL 为0 采用传统的URL参数模式
22
第3章 ThinkPHP 和 CodeIgniter在应用中比较
http://serverName/appName/?m=module&a=action&id=1
二、PATHINFO模式(默认模式):设置URL_MODEL 为1
默认情况使用PATHINFO模式,ThinkPHP内置强大的PATHINFO支持,提供灵活和友好URL支持。PATHINFO模式自动识别模块和操作,例如
http://serverName/appName/module/action/id/1/ 或者 http://serverName/appName/module,action,id,1/
在不考虑路由的情况下,第一个参数会被解析成模块名称(如果启用了分组的话,则依次往后递推),第二个参数会被解析成操作,后面的参数是显式传递的,而且必须成对出现,例如:
http://serverName/appName/module/action/year/2008/month/09/day/21/
其中参数之间的分割符号由URL_PATHINFO_DEPR参数设置,默认为”/”,例如我们设置URL_PATHINFO_DEPR为“-”的话,就可以使用下面的URL访问
http://serverName/appName/module-action-id-1/
注意不要使用”:” 和”&”符号进行分割,该符号有特殊用途。 略加修改,就可以展示出富有诗意的URL,呵呵~
如果想要简化URL的形式可以通过路由功能(后面会有描述)以及空模块和空操作。
在PATH_INFO模式下面,会把相关参数转换成GET变量,以及并入REQUEST变量,因此不妨碍URL里面的GET和REQUEST变量获取。
三、REWRITE模式: 设置URL_MODEL 为2 该URL模式和PATHINFO模式功能一样,除了可以不需要在URL里面写入口文件,和可以定义.htaccess 文件外。在开启了Apache的URL_REWRITE模块后,就可以启用REWRITE模式了,具体参考下面的URL重写部分。
四、兼容模式: 设置URL_MODEL 为3
兼容模式是普通模式和PATHINFO模式的结合,并且可以让应用在需要的时候直接切换到PATHINFO模式而不需要更改模板和程序,还可以和URL_WRITE模式整合。兼容模式URL可以支持任何的运行环境。
兼容模式的效果是:
http://serverName/appName/?s=/module/action/id/1/
并且也可以支持参数分割符号的定义,例如在URL_PATHINFO_DEPR为~的情况下,下面的URL有效:
http://serverName/appName/?s=module~action~id~1 其实是利用了VAR_PATHINFO参数,用普通模式的实现模拟了PATHINFO的模式。但是兼容模式并不需要自己传s变量,而是由系统自动完成URL部分。正是由于这个特性,兼容模式可以和PATHINFO模式之间直接切换,而不需更改模板文件里面的URL地址连接。[2]
3.4.2 CodeIgniter的表单
CodeIgniter的表单功能也很强大,并且,CodeIgniter提供了表单验证函数,而
23