CodeIgniter 入门

主页 http://codeigniter.com/

网上想要比较cakephp和CodeIgniter,答案是萝卜白菜各有所爱。

cakephp模仿ROR,没用过ROR的学习曲线要大些。

CodeIgniter适合小型项目,性能比较好,因为没有过多累赘。

cakephp中型项目,性能稍逊。但是特性较CodeIgniter多。

 

CodeIgniter文档较详细:

下载包中user_guide文件夹/index.html有,但是那个tablecontent一开始没注意到,它在页面顶部,点击出来下拉目录,囧。

照着文档读一遍,两个小时就够了,简单吧。

笔记:

以其index.php来作为你项目入口,

 

apache配置中需要配置文件夹

Options execCGI FollowSymLinks
AllowOverride All


  • 静态页面控制:

默认连接方式是http://example.com/[controller-class]/[controller-method]/[arguments]

那么 http://example.com/news/latest/10 就会找到news这个控制器类调用其latest方法,传入10这个参数。

这个配置是在application/config/routes.php中

注意,例如这样的配置

routes[‘welcome’] = ‘welcome’

将会在controller中寻找welcome 文件夹中(或下面的controller子文件夹)的welcome.php文件中的Welcome类。文件名必须小写,类名必须以大写字母开头。

 

URL Helper类问题:

这里面的方法都是依据config.php中配置的$config['base_url']来的,

因此如果你配置的是abc.com,那么即使用户使用www.abc.com访问,返回的都是不带www的url,包括

current_url()这个方法也是如此,显然这个方法是个鸡肋,遇到ajax请求就跨域了,因为www.abc.com和abc.com是跨子域的。

 

异常处理:

他的异常在index.php中设置,不知道是什么原因,在其他地方再设置就没什么作用了,一旦出错就显示一堆错误,只能使用ob_end_clean();把它的输出清除掉。

 

日志:

system\libraries\Log.php log_message('level', 'message')

日志显示级别在config.php中配置

$config['log_threshold'] = 4;

$config['log_path'] = ''; //空表示在站点目录下logs文件夹中,以php为扩展名

 

CI有个session过期的bug,因为它是每隔一段时间更新session对应的cookie(这是为了安全起见),所以可能造成前后两个ajax请求的session对应的cookie不一样:

1:请求A调用时正好导致更新cookie

2:请求B此时还是使用老cookie,由于A请求改了cookie,则会导致找不到session。

参见:http://codeigniter.com/forums/viewthread/102456/

这上面也没好的办法,要么是注释更新cookie的代码,要么将$config['sess_time_to_update']     = 300;设置为很长就不会调用更新cookie的方法。

参见http://www.path8.net/tn/archives/2526

CI可通过数据库保存session,但是无论怎样,都是依赖客户端的cookie配合的,所以定时更新cookie的方法让session长期不过期的目标不好实现。

下面是自定义的Session类,CI可以自定义核心类:

user_guide/general/core_classes.html

放在application/core/即可,会自动加载的,要以MY_开头,要继承想要扩展的父类。

下面是MY_Session类:

<?php
<?php
if (!defined('BASEPATH'))
	exit ('No direct script access allowed');

/**
 * ------------------------------------------------------------------------
 * CI Session Class Extension for AJAX calls.
 * ------------------------------------------------------------------------
 *
 * Save as application/libraries/MY_Session.php
 */

if (!function_exists('is_ajax_request')) {
	function is_ajax_request() {
		return (!empty ($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest');
	}
}

class MY_Session extends CI_Session {

	// --------------------------------------------------------------------

	/**
	 * sess_update()
	 *
	 * Do not update an existing session on ajax calls
	 *
	 * @access    public
	 * @return    void
	 */
	public function sess_update() {
		//still have the problem
//		return;
		if (!is_ajax_request()) {
			parent :: sess_update();
		}else{
		}
	}

	// --------------------------------------------------------------------

	/**
	 * sess_destroy()
	 *
	 * Clear's out the user_data array on sess::destroy.
	 *
	 * @access    public
	 * @return    void
	 */
	public function sess_destroy() {
		$this->userdata = array ();

		parent :: sess_destroy();
	}

}

// ------------------------------------------------------------------------
/* End of file MY_Session.php */
/* Location: ./application/libraries/MY_Session.php */
?>

我使用之后发现还是有问题,要从根本上解决还是要将sess_update这个方法不起作用,但是这样的话降低了安全性,CI主要是为了cookie安全才定时刷新cookie的。

is_ajax_request这个方法判断的头对于jquery 来说是靠谱的,因为jq加了这个头,但是别的库就没有。在后来的CI版本中添加了input->is_ajax_request方法。


配置hook

user_guide/general/hooks.html

首先需要在application/config/config.php中设置$config['enable_hooks'] = TRUE;

然后在application/config/hooks.php中设置扩展

这里可以配置pre_controller的hook,即controllers被调用之前的hook

$hook['pre_controller'][] = array (

    'class' => 'MYClass'

);


Total views.

© 2013 - 2024. All rights reserved.

Powered by Hydejack v6.6.1