CI框架7点开发技巧
如果你还不知道ci是什么东东,请看这篇文章CI框架简单实例及其运行机制介绍
下面都是CI框架的高级开发技巧!
php教程如下:
(1)自动加载模型models
从此你不在需要继承model类了。使用方法就是就是添加一个php5风格的 autolader 函数,添加这些代码到system/application/config/config.php:
<?php // ... function __autoload($class) { if (file_exists(APPPATH."models/".strtolower($class).EXT)) { include_once(APPPATH."models/".strtolower($class).EXT); } } ?>
如果你也有兴趣运用这个技巧到controller,你只需要添加以下代码来代替上面的代码。
<?php // ... function __autoload($class) { if (file_exists(APPPATH."models/".strtolower($class).EXT)) { include_once(APPPATH."models/".strtolower($class).EXT); } else if (file_exists(APPPATH."controllers/".strtolower($class).EXT)) { include_once(APPPATH."controllers/".strtolower($class).EXT); } } ?>
任何时候,你试着使用一个没有定义的类时候,这个__autoload函数将会被调用,它将会加载这个类文件。
(2)防止model-controller名字冲突
php文件取名也很重要,如下php代码:
class Post extends Model {
// ...
}
现在你就不能有一个像这样的url:
这个原因是因为你也需要有一个名字为post的controller,如果创建了这样的一个类的话将会引起致命错误。
但是使用了这个技巧一般,一切皆有可能。那个url的控制器看起来是这样的:
// application/controllers/post.php
class Post_controller extends Controller {
// ...
}
技巧:
为了避免这个问题,通常大多数人都是添加‘_model’后缀到model名字(例如命名Post_model)。
在所有的应用程序中Model对象都被创建和引用,所以在所有的model名字后面跟上‘_model’有些无聊。
我认为最好的办法就是在controller上来添加后缀,因为在代码中controller的名字几乎从来不会被引用。
首先我们需要继承Router class。创建这样一个文件:"application/libraries/MY_Router.php"
class MY_Router extends CI_Router { var $suffix = '_controller'; function MY_Router() { parent::CI_Router(); } function set_class($class) { $this->class = $class . $this->suffix; } function controller_name() { if (strstr($this->class, $this->suffix)) { return str_replace($this->suffix, '', $this->class); } else { return $this->class; } } }
现在编辑"system/codeigniter/CodeIgniter.php"第153行
if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT))
然后第158行
include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT);
然后编辑"system/libraries/Profiler.php"的第323行
$output .= "<div>".$this->CI->router->controller_name()."http://www.phpddt.com/".$this->CI->router->fetch_method()."</div>";
大功告成。使用这个技巧一定需要记住的是要把‘_controller’后缀放到你的controller的类的名字后面,不是放在你的控制器文件名中。
(3)表单验证“唯一值”(如注册用户名email)
Ci有一个完美的表单验证类。但是这个验证有一点不足,例如当大部分用户注册用户名的时候,需要验证用户名没有被占用,或者邮箱是否存在在系统中。
使用这个技巧,你将能够非常容易添加这项验证规则到你的表单提交中。
注意最后一部分"unique[User.username]."这个新的验证规则叫做“unique”,并且带了一个方框在这个中括号中,它们是“tablename.filedname”.所以它将会检测数据库的“user”数据表的“username”列确定提交的值在数据库里面不存在。
同理,你也能利用这个规则验证相同的邮件地址。
$this->form_validation->set_rules('email', 'E-mail',
'required|valid_email|unique[User.email]');
你的应用程序得到错误信息
与其说这是一个技巧而不如说是一个扩展。虽然如此,我们将要添加一个核心ci类库并且改善它。
创建 "application/libraries/MY_Form_validation.php"文件
现在你就能使用这个“唯一”验证规则了。
(4)从命令行运行codeigniter
这是一个很酷的方法执行CI
创建一个“cli.php”文件在ci的根目录
if (isset($_SERVER['REMOTE_ADDR'])) {
die('Command Line Only!');
}
set_time_limit(0);
$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'] = $argv[1];
require dirname(__FILE__) . '/index.php';
class MY_Form_validation extends CI_Form_validation { function unique($value, $params) { $CI =& get_instance(); $CI->load->database(); $CI->form_validation->set_message('unique', 'The %s is already being used.'); list($table, $field) = explode(".", $params, 2); $query = $CI->db->select($field)->from($table)->where($field, $value)->limit(1)->get(); if ($query->row()) { return false; } else { return true; } } }
如果你在linux环境下使用,并且想要让这代码自动执行,你能添加以下代码在cli.php文件的第一行
#!/usr/bin/php
如果你需要一个仅仅能在命令行下使用的控制器,你能阻止web调用控制器构造函数
(5)添加Doctrine orm 到codeigniter
Doctine是一个流行的php的关系对象映射(orm)。添加它到ci里面以后,你将会一个更加强大的模型层。
技巧: