67677新澳门手机版 > 67677新澳门手机版 > CodeIgniter中驱动器的使用方法
CodeIgniter中驱动器的使用方法
2020-03-12 23:41

本文由码农网 – 邱康原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!

去码市 下载 CI框架

对 CodeIgniter 的介绍

驱动器“Drivers”是CodeIgniter框架从2.0版本开始加入的新特性。正如中文版译者所言:

最近再给一个APP写API,同时还要写相应的后台管理网站。为了便于开发和代码组织与管理,我决定采用一个现有的框架。Codeigniter由于其轻量容易自定制的特点吸引了我,一路开发过来也有大半年时间了,写下一些自己在开发过程中的一些体会来与大家共勉。

下载完成之后 解压 目录结构如下:

大多数PHPer都想写出运行状态良好的应用程序,而且希望尽可能做得简单且不费事。这篇文章是有关 CodeIgniter的(以后简称CI),CI是一个达成上面目的的所谓框架。

图片 1

开发工具

开发工具有好多,每个人的习惯也不同。Eclipse一直是我的最爱,那么怎么让Eclipse支持codeigniter呢?

首先这是个PHP项目,所以得让Eclipse支持PHP。假设你的计算机已经安装了PHP,那么最简单的做法就是在Eclipse的market space中搜索PDT并安装。具体操作:Help -> Eclipse Marketplace。在输入框中输入PDT,点击find,如图:

图片 2

点击右下方的install,等待几分钟即可。

现在可以在Eclipse中写PHP了,不过对于codeigniter来说,经常用到的语句类似如下:

$this->load->model ( 'user_model' );

$this->input->post ('phone');

每次都要手动输入这么长的类似的语句对于追求高效的人来说显然是不可取的,所以得让Eclipse支持codeigniter特定的代码提示,包括Controller和Model。把如下代码添加到

system/core/ 目录下的Controller文件中CI_Controller类的构造函数之前,这其实就是进行

变量声明,Model文件也是同样操作。

 /**
       * @var CI_Config
       */

       var $config;

       /**
       * @var CI_DB_active_record
       */

       var $db;

       /**
       * @var CI_Email
       */

       var $email;

       /**
       * @var CI_Form_validation
       */

       var $form_validation;

       /**
       * @var CI_Input
       */

       var $input;

       /**
       * @var CI_Loader
       */

       var $load;

       /**
       * @var CI_Router
       */

       var $router;

       /**
       * @var CI_Session
       */

       var $session;

       /**
       * @var CI_Table
       */

       var $table;

       /**
       * @var CI_Unit_test
       */

       var $unit;

       /**
       * @var CI_URI
       */

       var $uri;

       /**
       * @var CI_Pagination
       */

       var $pagination;

现在效果如下:

图片 3

只需输入$this 即可产生代码提示,效率提高不少。

图片 4

如果你只是要达成一个最终的结果,而把中间所有的编码细节和复杂统统丢给一个框架,CI是你最好的朋友。

笔者看了这三篇英文参考,加上自己的一些理解,对官方文档关于驱动器的这一部分进行了一些补充。

自定义辅助函数和库

一般一个项目中会有许多相同的逻辑,会使用到相同的代码。如果每次都去复制粘贴不仅麻烦而且不利于后续修改,想到需要修改一个逻辑就要到每个文件里修改代码就觉得可怕(涉及到设计模式这一块了,值得我们学学)。所以你要善于利用那些自定义辅助函数(helpers)和自定义的库(libraries)。把相同的逻辑封装成函数或者类,每次遇到相同的逻辑之时只需调用现成的helper或者library即可,修改也只需要在helper或者library中一处修改,不需要到处找代码。

举一个我项目中的例子。API需要给APP发送的请求返回json格式数据,那么在PHP中的一种实现方法就是:

echo json_encode ( $data);//$data 是array类型的数据

但是如果$data中包含中文字符的话,输出的json数据会把中文变成Unicode编码,为了避免客户端需要再次处理数据,需要加入一个参数,即:

echo json_encode ( $data , JSON_UNESCAPED_UNICODE);//$data 是array类型的数据

这样就能输出原始的中文了。但是问题又来了,每次都要写这么长一段代码实在是麻烦,所以封装成一个辅助函数。在application/helpers 文件夹中新建一个文件render_helper.php。其中代码如下:

<?php

defined ( 'BASEPATH' ) or exit ( 'No direct script access allowed' );

/**

 * 打印不转义中文的json

 * @param [array] $data

 */

function echo_json($data) {

       echo json_encode ( $data, JSON_UNESCAPED_UNICODE );

}

那么每次调用之时只需先在类中的构造函数载入该辅助函数,如下:

$this->load->helper ( 'render' ); // 载入打印json的自定义辅助函数

就可以在本类的所有成员函数中使用该方法:

echo_json ( $data);

这样省时省力(加上Eclipse的代码提示,你只需要输入echo,这个函数就可以出来了)。以后需要修改成编码后中文,或者转换成英文等等(奇怪的需求~)你都可以只修改一行代码,效率提高不少。

然后 你在本地 配置apache 或者nginx服务器 如 我的本地路径访问 为:

CI有很多优点:免费, 轻量级, 容易安装, 它能使你的编程生涯变得很轻松。 这一章我们会告诉你:

1.什么是驱动器

驱动器是一种特殊类型的类库,它有一个父类和任意多个子类。子类可以访问父类, 但不能访问兄弟类。在你的控制器中,驱动器为你的类库提供了 一种优雅的语法,从而不用将它们拆成很多离散的类。

一般我们看到父类和子类,我们会毫不犹豫的认为他们是继承和派生的关系,但是这里需要注意的是,驱动器中所提到的子类,并不是真的继承了父类驱动器,仅仅是其有访问父类驱动器的权限,在其中一篇参考文献中,作者将父类称为主类(master class),将此类称为次类(sub class),个人认为这种叫法比官方的更为精确,所以后面借用这一称谓。关于这个注意事项在后面的例子里读者可以看到。

驱动器位于 system/libraries/ 目录,每个驱动器都有一个独立的目录,目录名和 驱动器父类的类名一致,在该目录下还有一个子目录,命名为 drivers,用于存放所有子类的文件。

善用缓存

如果一个APP的活跃用户不是很多,那么传统的LAMP架构就可以应付了。但是随着用户的逐渐增多,要想提高并发量,最好还是加一个缓存。在memcached和redis中,我选择了redis,主要因为它数据类型更丰富(不仅支持key-value型的数据,同时还提供list,set,zset,hash等数据结构的存储),能帮你实现一部分逻辑(避免重复造轮子)。与Eclipse配置同理,首先得让计算机上的PHP能够和redis通讯(假设你的计算机已经安装了redis),那么首选的是phpredis扩展,这里介绍一下我在Debain服务器上的配置过程,执行的命令如下:

wget https://github.com/nicolasff/phpredis/archive/master.tar.gz  #下载扩展

tar xvf master.tar.gz      #解压目录

cd phpredis-master/     #进入解压后的目录

phpize

./configure --enable-redis

make && make install    #安装

#但是报错-bash: phpize: command not found(在使用apt-get install php5安装php时,默

#认是没有安装phpize的,我们安装phpredis时,需要用到phpize,因此,需要先安装#phpize。我们通过安装php开发者工具来获取phpize。执行如下命令即可: apt-get install #php5-dev)

ls  /usr/lib/php5/20100525/#根据安装提示的文件,结果:curl.so  gd.so  redis.so

vim /etc/php5/apache2/php.ini   #打开PHP配置文件

# Dynamic Extensions 后面添加extension=redis.so,因为上面命令结果显示有redis.so

/etc/init.d/apache2 restart       #重启Apache服务器

现在PHP就能和redis通讯了,测试如下:

<?php

 $redis = new Redis();

 $redis->connect('127.0.0.1',6379);

 $redis->auth('你的密码');//为了安全,要给redis设置密码

 $redis->set('tom','hanks');

 echo ' tom:'.$redis->get('tom'). '</br>';// tom:hanks

echo 'will:'.$redis->get('will'); //will:

?>

好了,现在来到配置codeigniter使其能够使用redis的步骤了。Codeigniter3.0.0本身具有redis支持,但是它实现的功能过于单一,不能够满足我的业务需求,所以必须要修改。但是最好不要直接在/system/libraries/Cache/drivers/Cache_redis.php 中修改,因为以后codeigniter升级采用直接覆盖system文件夹的形式,会覆盖掉你的代码。所以最明智的做法还是自己创建一个库,具体步骤如下:

1、在application/config/redis.php 中加入配置信息:

<?php

defined ( 'BASEPATH' ) or exit ( 'No direct script access allowed' );

$config ['socket_type'] = 'tcp';

config ['host'] = '你的服务器域名或者IP';

$config ['password'] = '你的redis密码';

$config ['port'] = 6379;

$config ['timeout'] = 0;

2、在application/libraries中建立如下图的文件结构

图片 5

Rediscli.php 代码如下:

<?php

defined ( 'BASEPATH' ) or exit ( 'No direct script access allowed' );

class Rediscli extends CI_Driver_Library {

       public $valid_drivers;

       public $CI;

       function __construct() {

              $this->CI = & get_instance ();

              $this->valid_drivers = array (

                            'default'

              );

       }

}

Rediscli_default.php 代码从/system/libraries/Cache/drivers/Cache_redis.php 直接拷贝过来,唯一的不同是把类名从CI_Cache_redis改为Rediscli_default,这样就能按照官方的使用方法使用我们自己写的库。

3、现在可以在Rediscli_default.php中添加或者修改方法,具体操作取决于你自己的应用的需求。比如在我的应用中,需要保持一个一定长度的队列,所以在Rediscli_default类中添加如下两个方法:

/**

       * 弹出链表头元素

       * @param unknown $key,链表名              

       */

       public function lpop($key) {

              return $this->_redis->lPop ( $key );

       }

       /**

       * 插入元素到表尾

       * @param unknown $key,链表名              

       * @param unknown $value,待插入值              

       */

       public function rpush($key, $value) {

              return $this->_redis->rPush ( $key, $value );

       }

某个类需要调用该库时只需在其构造函数中添加如下代码:

$this->load->driver ( 'rediscli' ); // 加载redis自定义库

$this->rediscli->default->is_supported ();//判断是否支持redis并打开连接

则该类的每个函数就都可以使用Rediscli_default类中的任一方法,示例如下:

$this->rediscli->default->lpop('delnews');//弹出名为delnews的链表头元素

$this->rediscli->default->rpush('delnews',$nid);//该链表加入尾元素$nid

如果 配置成功 访问 则显示:

. CI 能为你做什么?

2.如何使用驱动器?

要使用一个驱动器,你可以在控制器中使用下面的方法来进行初始化:

$this->load->driver('class_name');

class_name 是你想要调用的驱动器类名,例如,你要加载名为 Some_parent 的驱动器, 可以这样:

$this->load->driver('some_parent');

然后就可以像下面这样调用该类的方法:

$this->some_parent->some_method();

而对于那些子类,我们不用初始化,可以直接通过父类调用了:

$this->some_parent->child_one->some_method();

$this->some_parent->child_two->another_method();

 

举一个实际的例子,假如我们需要创建一个Connect类来连接各种社交服务,并且从这些平台获取一些数据。直接借用外国网友的例子。

 

实际的代码看起来是这样的:

$this->load->driver('connect');

$this->connect->facebook->get_friends();

$this->connect->twitter->get_twitts();

这样就把一些分散的功能集中到一个类库中了,而且结构非常清晰。

登陆逻辑的实现

对于我们的APP来说,每个请求都要判断用户是否已登陆,对于登陆的合法用户正常显示请求,对于未登录的用户提示“请先登录”。一般的web应用采用cookie-session机制,一般的session都是以文件形式保存在服务器上,考虑到文件访问慢于内存访问,我们可以配置codeigniter的session保存于redis中。我这里模仿这种机制:用户正常login后返回一个特定的id和特定的token(你可以自定义产生算法),服务器以id为key、token为value直接保存在redis中。以后的每次访问APP都必须带上用appsecret(预定义)加密后的参数id和token,服务器端校验成功即正常返回数据,否则提示“请先登录”。

那么是否每个类都需要写一遍检查登陆的代码呢?当然不能这么干,我们可以自定义一个基类,在该基类的构造函数中检查登陆状态(还可以在这里加载常用的辅助函数和库,比如上面的render_helper 和 rediscli)。然后其他的业务逻辑的类就继承该基类,并完成其自身逻辑即可。

具体操作就是在 application/core 中新建文件 MY_Controller.php,该文件对应MY_Controller类(继承CI_Controller类)。该类只需要一个构造函数完成上述功能即可。

然后其它逻辑类只需继承MY_Controller类就不必再次校验登陆状态,而只需完成自身逻辑。

图片 6

. 什么是“框架” ?CI 为什么能被称为框架?

3.如何创建驱动器

CI的官方文档中并没有详细介绍如何自己写一个驱动器,因此这里是重点。创建驱动器的第一步是创建一个驱动器文件目录结构, 这里我们创建自己的驱动器,要放在application/libraries目录下。文件夹名和驱动器类名相同,并且首字母大写如Connect,在此文件夹中再创建一个子文件夹,一定要取名为drivers,注意这里文件夹名称是小写字母,在drivers文件内创建次驱动器文件,文件名以主驱动器类名加下划线开头。

驱动器目录和文件结构布局如下图所示:
图片 7

创建主驱动器类

application/libraries/Connect/Connect.php

<?php

 

if (!defined('BASEPATH'))

    exit('No direct script access allowed');

 

classConnectextendsCI_Driver_Library

{

    public$valid_drivers;

    public$CI;

 

    function__construct()

    {

        $this->CI = &get_instance();

        $this->CI->config->load('connect', TRUE);

        $this->valid_drivers = $this->CI->config->item('modules', 'connect');

 

    }

    publicfunctionget_friends()

    {

        return$this->twitter->get_friends() . $this->facebook->get_friends();

    }

 

}

读者应该注意到了主驱动器类继承的是CI_Driver_Library,变量$valid_drivers是必须的,它是用来告诉框架应该加载哪些次驱动器,它是一个包含次驱动器类名称的数组。有两种方法来定义这个变量:

第一种方法是直接在驱动器代码中定义:

将下面的代码替换构造函数的最后一句

$this->Valid_drivers= array('connect_twitter', 'connect_facebook');
第二种方法是通过配置文件:

推荐采用这种方法,维护起来比较方便。创建一个文件application/config/connect.php

<?php

$config['modules'] = array('connect_twitter', 'connect_facebook');

这个字段取名为modules,你可以自己取一个名称,然后正如上面那个例子那样来调用。
在例子中我们还用$CI变量引用了框架的超级对象,然后加载配置文件,参数TRUE是为了防止名称与框架冲突,主驱动器类中的public和protected变量和方法在次驱动器中都是可以访问的。

创建次驱动器类
application/libraries/Connect/drivers/Connect_twitter.php

<?php

 

if (!defined('BASEPATH'))

    exit('No direct script access allowed');

 

classConnect_twitterextendsCI_Driver

{

    publicfunctionget_twitts()

    {

        return'Мои последние твитты:';

    }

 

    publicfunctionget_friends()

    {

        return'@vanya, @stepa ';

    }

}

 

application/libraries/Connect/drivers/Connect_facebook.php

<?php

 

if (!defined('BASEPATH'))

    exit('No direct script access allowed');

 

classConnect_facebookextendsCI_Driver

{

    publicfunctionget_friends()

    {

        return'Ivan,  Stepan ';

    }

}

 

这里我们注意到次驱动器并不是继承主驱动器,也没有继承CI_Driver_Library而是CI_Driver。

总结

Codeigniter是我最喜欢的一个PHP框架(相比于thinkPHP,Zend Framework等等),主要在于其易安装,轻量,易自定制的优点。把握好这些优点,我们就能写出不逊于那些重量级框架写出来的应用,并且省时省力。

作为一个学生,在摸索学习的路上还有很多问题需要解决,本文的目的在于和大家分享,更重要的是大家有什么建议或者批评请一定不吝赐教哈,我的微博:邱康singasong。

这个php页面 在 application/views/目录下 但是 CI的路径访问流程 都是 先访问 控制器 然后再到View

如 访问 时 其实它的实际路径为:

index.php 是 指向 application/controllers 目录下的入口

Welcome 是controllers目录下控制器类 类名就为Welcome

index 是控制器中的默认方法

CI严格贯彻MVC思想,因此基于此思想的文件访问也比较严格,controllers控制器是所有view的入口,从URL上是不能直接访问view的,必须通过控制器,也就是说要写控制器的路径,在写代码的时候,路径也是不能随便写的、

. “开源”商业模式

4.在控制器中使用驱动器

由于所有次驱动器有方法主驱动器的权限,次驱动器仅能通过主驱动器访问,因此次驱动器之间的数据交换要通过主驱动器作为中间桥梁。
. application/controller/home.php

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

 

classHomeextendsCI_Controller {

    publicfunction__construct()

    {

        parent::__construct();

        $this->load->driver('connect');

    }

 

    publicfunctionfriends()

    {

        echo'我社交网络的朋友: ';

        echo$this->connect->get_friends();

        //同时从两个站点获得

    }

 

    publicfunctiontwitts()

    {

        echo$this->connect->twitter->get_twitts();

        // Twitter记录

    }

}

这个例子相当简单, 但是对于理解CI中驱动器的概念很有参考价值,更复杂的应用可以参考最后一篇文章。

 

 

参考文档:

·         Usage of drivers in CodeIgniter

·         Codeigniter Drivers Tutorial(这篇比较复杂)

 

来自为知笔记(Wiz)

那么 我现在 要自己创建一个api文件在controllers 目录下 然后在api目录下创建控制器UserInfoController 里面声明一个 login方法 输出一个字符串

. CI的某些不足(是的, 它不完美)

附件列表

 

如图:

CodeIgniter 能为你做什么?

图片 8

如果你已经是一位PHPer, 开发过PHP应用, CodeIgniter 将会帮助你做得更好, 更容易达成目标。 CI会减少你的代码数量。你的脚本可读性也会更好,更容易升级。它会使你的网站结构更紧凑,代码更强健, 如果不是很好地研究CI的源代码的话,你可能还无法察觉到它的强健。

那么 这个方法的访问路径为:

对大多数兄弟来讲,你可能已经花了不少时间, 系统地学习了PHP、HTML和CSS,当然还有MySQL什么的。不过如果使用CI,你只需要一些基本的LAMP(WAMP)知识, 你没有必要先成为一个专家才能使用CI。 你完全可以先借助于CI或别的什么框架软件,成为一个有生产力的PHP程序员,拿着高薪然后优雅地进一步学习PHP的中高级知识,直至成为一位真正的PHP骨灰级人物。

浏览器 打印出 输出的字符串

下述情形,你最好不要使用CI:

图片 9

. 你没有一点PHP和HTML的基本知识.

这种简单的访问路径 是不需要修改 routes.php 和 config.php 配置文件的

. 四五个页面的小程序.

. 只用极少的代码就要完成一个CMS或FORUM程序(CI做不到,神仙也做不到)

节约时间

CI学习周期短,见效快。 让我们试着评估一下相关的要素:

CI如何减少代码数量?

你真的可以减少很多工作量:敲击键盘的次数减少了, 代码错误减少了, 你只需要较少的时间调试代码。 代码量减少还意味着你只需要较少的空间来存放应用程序。

举二个例子(稍后它们会被进一步分析, 因此不用担心如何了解它们的工作原理!)

想像你正在写一个MySQL数据库查询。 可能的代码如下:

PHP

   $connection = mysql_connect("localhost","fred","12345");
   mysql_select_db("websites", $connection);
   $result = mysql_query("SELECT * FROM sites", $connection);
   while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
      foreach ($row as $attribute) {
         print "{$attribute[1]} ";
      }
   }

复制代码

现在看看CI如何处理同一个问题:

PHP

$this->load->database('websites');
$query = $this->db->get('sites');
foreach ($query->result() as $row) {
    print $row->url;
}

复制代码

比较字符数: 前者336,后者112。

第二个例子,现在让我们想像你正在用HTML写一个数据输入窗口, 你想要一个下拉输入框。下拉框中有三个选项。代码如下:

HTML

<select name="type">
<option value="1">www.this.com</option>
<option value="2">www.that.com</option>
<option value="3" selected>www.theother.com</option>
</select>

上一篇:PHP中的防御性编程 下一篇:没有了