codeigniter框架开发技巧
codeigniter框架开发技巧
来源:未知 时间:2014-10-20 11:36 阅读数:171 作者:xbdadmin
[导读] (1)自动加载modelsphp5风格 使用这个技巧以后,我们将能够直接创建这个model对象。 这个代码是简洁的并且容易理解对象。 使用这个技巧以后会有2个影响。首先你不再需要继承model类了...
使用这个技巧以后,我们将能够直接创建这个model对象。
这个代码是简洁的并且容易理解对象。
使用这个技巧以后会有2个影响。首先你不再需要继承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名字冲突
使用这个技巧要达到的目标:
一般来说,模型和控制器你都不会有相同的类名字。让我先创建一个取名为post的model。
class Post extends Model {
// ...
}
现在你就不能有一个像这样的url:
http://www.mysite.com/post/display/13
这个原因是因为你也需要有一个名字为post的controller,如果创建了这样的一个类的话将会引起致命错误。
但是使用了这个技巧一般,一切皆有可能。那个url的控制器看起来是这样的:
// application/controllers/post.php
class Post_controller extends Controller {
// ...
}
注意这个“__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 style="color:#995300;font-weight:normal;padding:4px 0 4px 0">".$this->CI->router->controller_name()."/".$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"文件
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;
}
}
}
现在你就能使用这个“唯一”验证规则了。
(4)从命令行运行codeigniter
目标:
就像这个标题所说,我们的目标是能够从命令行运行ci。对于创建定时任务,这个是必须的,或者是运行更多的特别的操作,
所以你没有web脚本的资源限制,就像最大执行时间一样。
这就是本地windows机器上面运行的效果
技巧
创建一个“cli.php”文件在ci的根目录(即与index.php在同一目录)
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';
如果你在linux环境下使用,并且想要让这代码自动执行,你能添加以下代码在cli.php文件的第一行
#!/usr/bin/php
如果你需要一个仅仅能在命令行下使用的控制器,你能阻止web调用控制器构造函数
class Hello extends Controller {
function __construct() {
if (isset($_SERVER['REMOTE_ADDR'])) {
die('Command Line Only!');
}
parent::Controller();
}
// ...
}
(5)添加Doctrine orm 到codeigniter
(Doctrine orm是一个比较复杂的东西,我们将会继续出一些相关教程)
目标
Doctine是一个流行的php的关系对象映射(orm)。添加它到ci里面以后,你将会一个更加强大的模型层。
技巧:
其实安装Doctrine不是那么难,就像安装插件一样。然后一旦安装成功,你的model类将需要继承Doctrine基类,而不是继承ci的model类。这将会完全改变model层的工作方式。你建立的对象将会有持久的数据库连接并且也将能有其他对象的数据库关系。
按照以下几步:
1. 建立文件夹:application/plugins
2. 创建文件夹:application/plugins/doctrine
3. 下载文件(1.2版本的)
4. 从Doctrine复制“lib”文件夹到“application/plugins/doctrine”
5. 创建“application/plugins/doctrine_pi.php”
// system/application/plugins/doctrine_pi.php
// load Doctrine library
require_once APPPATH.'/plugins/doctrine/lib/Doctrine.php';
// load database configuration from CodeIgniter
require_once APPPATH.'/config/database.php';
// this will allow Doctrine to load Model classes automatically
spl_autoload_register(array('Doctrine', 'autoload'));
// we load our database connections into Doctrine_Manager
// this loop allows us to use multiple connections later on
foreach ($db as $connection_name => $db_values) {
// first we must convert to dsn format
$dsn = $db[$connection_name]['dbdriver'] .
'://' . $db[$connection_name]['username'] .
':' . $db[$connection_name]['password'].
'@' . $db[$connection_name]['hostname'] .
'/' . $db[$connection_name]['database'];
Doctrine_Manager::connection($dsn,$connection_name);
}
// CodeIgniter's Model class needs to be loaded
require_once BASEPATH.'/libraries/Model.php';
// telling Doctrine where our models are located
Doctrine::loadModels(APPPATH.'/models');
然后,编辑‘application/config/autoload.php’自动加载Doctrine插件
$autoload['plugin'] = array('doctrine');
你也要确定在“application/config/database.php的数据库配置好了,”
就这样,现在你就能使用ci应用程序创建Doctrine模型了。阅读更多的资源在这里。
(6)运行多个站点
目标:
这个技巧将会使安装一个codeigniter就能运行多个站点成为可能,每个站点有它自己的application文件夹,但是他们共享这相同的系统文件夹。
安装ci在服务器的任何位置。然后将application文件夹从system文件夹拿出来。放在外面,请看上面的图片。
现在复制index.php文件到每个站点的跟目录下面(即图中的application_site1、application_site2等)
然后编辑它:
在第26行,给出system文件夹的完整路径
$system_folder = dirname(__FILE__) . '../codeigniter/system';
在第43行,给出application文件夹的文章路径
$application_folder = dirname(__FILE__) . '../application_site1';
现在你就能使用独立的application文件夹来建立不同的站点了,而只是共享同一个system文件夹
这里有一个相似的操作在ci用户手册
(7)允许所有类型的文件上传
目标:
当使用ci的上传类的时候,你必须指明哪些文件类型允许上传。
$this->load->library('upload'); $this->upload->set_allowed_types('jpg|jpeg|gif|png|zip');
如果你没有指明特定的上传类型,你将会从ci那里得到一个错误信息"Youhave not specified any allowed file types."
所有,默认的方式,将没有办法允许所有的文件上传。我们需要做一些小的改变来处理这个限制。我们设定“*”将能够运行所有类型的文件上传。
$this->load->library('upload'); $this->upload->set_allowed_types('*');
技巧:
我们需要修改上传文件类。
创建文件:application/librarys/My_upload.php
class MY_Upload extends CI_Upload {
function is_allowed_filetype() {
if (count($this->allowed_types) == 0 OR ! is_array($this->allowed_types))
{
$this->set_error('upload_no_file_types');
return FALSE;
}
if (in_array("*", $this->allowed_types))
{
return TRUE;
}
$image_types = array('gif', 'jpg', 'jpeg', 'png', 'jpe');
foreach ($this->allowed_types as $val)
{
$mime = $this->mimes_types(strtolower($val));
// Images get some additional checks
if (in_array($val, $image_types))
{
if (getimagesize($this->file_temp) === FALSE)
{
return FALSE;
}
}
if (is_array($mime))
{
if (in_array($this->file_type, $mime, TRUE))
{
return TRUE;
}
}
else
{
if ($mime == $this->file_type)
{
return TRUE;
}
}
}
return FALSE;
}
}
codeigniter框架开发技巧的更多相关文章
- CodeIgniter框架开发的统计程序源代码开放
文章来源: PHP开发学习门户 自己初学php时,用CodeIgniter框架开发的后台统计程序源代码 程序部分页面如图: 具体配置及下载源代码:http://bbs.phpthinking.com/ ...
- 使用 CodeIgniter 框架快速开发 PHP 应用(四)
原文:使用 CodeIgniter 框架快速开发 PHP 应用(四) 使用 CI 简化数据库开发你学习CI 是因为你想要使编程更容易和更有生产力.这一章讲述CI的Active Record类. 如果C ...
- 使用 CodeIgniter 框架快速开发 PHP 应用(三)
原文:使用 CodeIgniter 框架快速开发 PHP 应用(三) 分析网站结构既然我们已经安装 CI ,我们开始了解它如何工作.读者已经知道 CI 实现了MVC式样. 通过对目录和文件的内容进行分 ...
- Codeigniter开发技巧:连接多个数据库(可实现DB读写分离)
在开发中,我们有时候会遇到在同一程序中链接多个数据库的需求,这对Codeigniter框架来说是很简单的,我们只需要在 database.php文件中配置少许参数即可. 默认情况下,CI配置的是链接一 ...
- 使用 CodeIgniter 框架快速开发 PHP 应用(七)
原文:使用 CodeIgniter 框架快速开发 PHP 应用(七) CodeIgniter 和对象这是玩家章节.它讲述的是 CodeIgniter 的工作原理,也就是揭开CI头上'神秘的面纱'.如果 ...
- 使用 CodeIgniter 框架快速开发 PHP 应用(六)
原文:使用 CodeIgniter 框架快速开发 PHP 应用(六) 简化使用 Session 和安全理论说得够多了! 现在让我们开始写我们自己的应用. 在这一章里,我们将会大致描述一下我们要建立的一 ...
- 使用 CodeIgniter 框架快速开发 PHP 应用(五)
原文:使用 CodeIgniter 框架快速开发 PHP 应用(五) 简化 HTML 页面和表格设计这一章介绍了又一个节约你的时间而且使你的代码更具安全性和逻辑性的领域.第一,我们将会介绍创建视图的各 ...
- 使用 CodeIgniter 框架快速开发 PHP 应用(二)
原文:使用 CodeIgniter 框架快速开发 PHP 应用(二) 二分钟: 建立一个 CodeIgniter 网站用CI建一个网站很容易. 这一章很短,解释了用CI制作网站时发生了些什么,哪些文件 ...
- 使用 CodeIgniter 框架快速开发 PHP 应用(一)
原文:使用 CodeIgniter 框架快速开发 PHP 应用(一) 对 CodeIgniter 的介绍大多数PHPer都想写出运行状态良好的应用程序,而且希望尽可能做得简单且不费事.这篇文章是有关 ...
随机推荐
- python中pandas数据分析基础3(数据索引、数据分组与分组运算、数据离散化、数据合并)
//2019.07.19/20 python中pandas数据分析基础(数据重塑与轴向转化.数据分组与分组运算.离散化处理.多数据文件合并操作) 3.1 数据重塑与轴向转换1.层次化索引使得一个轴上拥 ...
- 已解决!kali桌面无法放置快捷方式问题
kali不知从哪个版本更新之后桌面上就不能添加快捷方式了,经过一番折腾找到了解决方法. 1.终端运行命令:apt-get install gnome-shell-extension-desktop-i ...
- ACM-寻宝
题目描述:寻宝 有这么一块神奇的矩形土地,为什么神奇呢?因为上面藏有很多的宝藏.该土地由N*M个小正方形土地格子组成,每个小正方形土地格子上,如果标有“E”,则表示该格可以通过:如果标有“X”,则表示 ...
- redis.conf文件配置
最重要三个配置 1. bind 127.0.0.1 需要注释掉这一行,使别的主机可以访问 2. daemonize no 需要改为yes,使其后台运行 3. requirepass foobared ...
- 基于Ambari的WebUI实现集群扩容案例
基于Ambari的WebUI实现集群扩容案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.将HDP的服务托管给Ambari服务 1>.点击“Service Auto S ...
- CentOS 6.8 32位 安装mysql8
1.清理掉之前安装过的mysql rpm -qa | grep mysql mysql-libs-5.1.52-1.el6_0.1.x86_64 yum remove mysql-libs-5.1.5 ...
- 《动手学深度学习》系列笔记—— 1.2 Softmax回归与分类模型
目录 softmax的基本概念 交叉熵损失函数 模型训练和预测 获取Fashion-MNIST训练集和读取数据 get dataset softmax从零开始的实现 获取训练集数据和测试集数据 模型参 ...
- [洛谷Luogu]P1803 线段覆盖问题
贪心想法题解的各位dalaodalaodalao都讲得很清楚了,在下就提供一种桶排的做法吧. 因为给出数据范围 0≤ai<bi≤10000000≤ai<bi≤10000000≤ai< ...
- 024-PHP常用字符串函数(一)
<?php $first = "abc"; $second = "aBc"; )//字串比较 { print("字符串相等:".&qu ...
- 自定义jqGrid编辑功能,当行获取焦点时编辑,失去焦点时保存
http://www.360doc.com/content/17/0719/15/9200790_672577533.shtml /********************************** ...