热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CI框架7点开发技巧

如果你还不知道ci是什么东东,请看这篇文章CI框架简单实例及其运行机制介绍下面都是CI框架的高级开发技巧!php教程如下:(1)自动加载模型models从此你不在需要继承model类了

如果你还不知道ci是什么东东,请看这篇文章CI框架简单实例及其运行机制介绍

下面都是CI框架的高级开发技巧!

php教程如下:

(1)自动加载模型models

从此你不在需要继承model类了。使用方法就是就是添加一个php5风格的 autolader 函数,添加这些代码到system/application/config/config.php:



如果你也有兴趣运用这个技巧到controller,你只需要添加以下代码来代替上面的代码。



任何时候,你试着使用一个没有定义的类时候,这个__autoload函数将会被调用,它将会加载这个类文件。

 

(2)防止model-controller名字冲突

php文件取名也很重要,如下php代码:

class Post extends Model {  

    // ...  

}

现在你就不能有一个像这样的url:

http://www.phpddt.com/post/display/13 

这个原因是因为你也需要有一个名字为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 .= "

".$this->CI->router->controller_name()."/".$this->CI->router->fetch_method()."
";  

 

大功告成。使用这个技巧一定需要记住的是要把‘_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里面以后,你将会一个更加强大的模型层。

 

技巧:

其实安装Doctrine不是那么难,就像安装插件一样。然后一旦安装成功,你的model类将需要继承Doctrine基类,而不是继承ci的model类。这将会完全改变model层的工作方式。你建立的对象将会有持久的数据库连接并且也将能有其他对象的数据库关系


class Hello extends Controller {  
    function __construct() {  
        if (isset($_SERVER['REMOTE_ADDR'])) {  
            die('Command Line Only!');  
        }  
        parent::Controller();  
    }  
    // ...  
}

按照以下几步:

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的数据库配置好了,”

 

 

(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)允许所有类型的文件上传

目标:进行文件上传时,经常遇到文件类型错误!

$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;  
    }  
}

推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
author-avatar
80后之多管闲事
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有