ThinkPHP和CodeIgniter的粗略比较(6)

2019-02-21 00:29

第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提供的大量标签,比如,之类的,而CodeIgniter里,则使用原生的PHP语法即可.比如foreach 和 是同等的.

建立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中,编辑简单的一句话来打印变量

这样,我们刷新页面发现,\被打印了出来.

在这个方面,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


ThinkPHP和CodeIgniter的粗略比较(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:产品设计设计-毕业论文(吸尘器)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: