ci框架驱动器
1.驱动器什么是
驱动器是一种特殊类型的类库,它有一个父类和任意多个子类。子类可以访问父类, 但不能访问兄弟类。在你的控制器中,驱动器为你的类库提供了 一种优雅的语法,从而不用将它们拆成很多离散的类。
一般我们看到父类和子类,我们会毫不犹豫的认为他们是继承和派生的关系,但是这里需要注意的是,驱动器中所提到的子类,并不是真的继承了父类驱动器,仅仅是其有访问父类驱动器的权限,在其中一篇参考文献中,作者将父类称为主类(master class),将此类称为次类(sub class),个人认为这种叫法比官方的更为精确,所以后面借用这一称谓。关于这个注意事项在后面的例子里读者可以看到。
驱动器位于 system/libraries/ 目录,每个驱动器都有一个独立的目录,目录名和 驱动器父类的类名一致,在该目录下还有一个子目录,命名为 drivers,用于存放所有子类的文件。
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();
这样就把一些分散的功能集中到一个类库中了,而且结构非常清晰。
3.如何创建驱动器
CI的官方文档中并没有详细介绍如何自己写一个驱动器,因此这里是重点。创建驱动器的第一步是创建一个驱动器文件目录结构, 这里我们创建自己的驱动器,要放在application/libraries目录下。文件夹名和驱动器类名相同,并且首字母大写如Connect,在此文件夹中再创建一个子文件夹,一定要取名为drivers,注意这里文件夹名称是小写字母,在drivers文件内创建次驱动器文件,文件名以主驱动器类名加下划线开头。
驱动器目录和文件结构布局如下图所示:

创建主驱动器类
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。
4.在控制器中使用驱动器
由于所有次驱动器有方法主驱动器的权限,次驱动器仅能通过主驱动器访问,因此次驱动器之间的数据交换要通过主驱动器作为中间桥梁。
. application/controller/home.php
<?phpif( ! defined(‘BASEPATH‘))exit(‘No direct script access allowed‘);
class Home extends CI_Controller {
publicfunction__construct()
{
parent::__construct();
$this->load->driver(‘connect‘);
}
publicfunction friends()
{
echo‘我社交网络的朋友: ‘;
echo$this->connect->get_friends();
//同时从两个站点获得
}
publicfunction twitts()
{
echo$this->connect->twitter->get_twitts();
// Twitter记录
}
}
ci框架驱动器的更多相关文章
- CI框架 -- 驱动器
驱动器目录及文件结构 下面是驱动器目录和文件结构布局的简单例子: /application/libraries/Driver_name Driver_name.php //驱动器名称 drivers ...
- CI框架浅析(全篇)
业余花了点时间看看CodeIgniter框架(简称CI),CI目前的稳定版本是 3.X,4.0版本已经出来了,但还在测试中,所以我分析的还是 3.x 版本. CI是一个很轻便的框架,整个下载包 ...
- CI框架浅析
CI框架浅析(全篇) 业余花了点时间看看CodeIgniter框架(简称CI),CI目前的稳定版本是 3.X,4.0版本已经出来了,但还在测试中,所以我分析的还是 3.x 版本. CI是一个很 ...
- ci框架登陆之后每隔几分钟就需要重新登录的问题
一个简单的登陆写好之后,发现每次进入需要登陆之后才能进入的页面都会跳转到登录页面,猜测应该是session被清了,打印出来,果然为空,但是我没有设置session的生存周期,按照默认的应该是24小时, ...
- 第一天ci框架开发商城2
ci框架开发商城2 1/28/2016 9:45:52 PM mvc完整案例 mvc完成新闻的增删改查 news控制器news.php class News extends CI_controller ...
- 第一天ci框架开发商城1
ci框架开发商城1 1/28/2016 9:43:52 PM userguide删除 system application controllers 控制器 models 模型 views 视图 模板 ...
- CI框架之HOOKS使用流程及原理
Ci框架中Hooks可以理解:在框架的执行流程过程中,允许开发者在固定的某些时间点上(如:调用控制器前,调用控制器后等时间点上),调用其他函数来扩充CI框架执行流程的一种方法.技术上来就是通过 ...
- CI框架使用PHPmail插件发送QQ邮件:
有助请顶,不好请评.0:33 2016/3/12CI框架使用PHPmail插件发送QQ邮件:发送成功,不过修改了主机参数,还包含了一个phpmail中的一个另外的文件,详见下方:参见:http://c ...
- 初学后台框架总结篇二——快速了解CI框架
一.下载CI框架并安装,这里放置一张自己的项目目录结构图 目录框架搭建好之后开始将自己的项目与框架融合 二.更改相关配置 1.用任何文本编辑器打开 application/config/config. ...
随机推荐
- Python小白的数学建模课-17.条件最短路径
条件最短路径问题,指带有约束条件.限制条件的最短路径问题.例如: 顶点约束,包括必经点或禁止点的限制: 边的约束,包括必经路段.禁行路段和单向路段:无权路径长度的限制,如要求经过几步或不超过几步到达终 ...
- 深入解析多态和方法调用在JVM中的实现
深入解析多态和方法调用在JVM中的实现 1. 什么是多态 多态(polymorphism)是面向对象编程的三大特性之一,它建立在继承的基础之上.在<Java核心技术卷>中这样定义: 一个对 ...
- 《手把手教你》系列技巧篇(二十)-java+ selenium自动化测试-元素定位大法之终卷(详细教程)
1.简介 这篇文章主要是对前边的文章中的一些总结和拓展.本来是不打算写着一篇的,但是由于前后文章定位元素的时间有点长,怕大家忘记了,就在这里简单做一个总结和拓展. 2.Selenium八种定位方式 S ...
- NOIP 模拟 $11\; \rm english$
题解 本题有一定代码难度 对于需要区间最大值,可以反过来考虑,先预处理出每个数所能扩展的最大边界,也就是说,求出一个最大的区间,其最大值为这个数,单调栈 \(\mathcal O(n)\) 求解 那么 ...
- 题解 [JXOI2012]奇怪的道路
考场上我坚持认为这是个组合数题... 看到\(k\leq8\)我想状压来着,但是不知道怎么压 实际上,对于点i和点j的连边(\(j\in[i-k, i-1]\))只有连或不连两种状态 而如果i与比j编 ...
- 《手把手教你》系列技巧篇(二十一)-java+ selenium自动化测试-浏览器窗口的句柄(详细教程)
1.简介 今天本来就要分享和讲解三大延时等待的,但是在写作过程中发了问题,会用到这一个知识点,于是就提前介绍一下,以便后边用到了可以更好的理解和掌握.本文就是要介绍如何获得浏览器窗体的句柄或者叫编号, ...
- ASP.NET Core端点路由中三种让人困惑的路由函数
早先提及了端点路由app.UseEndpoints, 端点路由强调的是端点和 路由,其核心目的是将 请求落地点与路由寻址方式解耦. 这里面有几个容易混淆的函数 MapControllerRoute M ...
- mpvue学习笔记
坑一: 挂载在Vue.prototype上的属性,在模板语法里面是undefined,必须经过computed计算过一下才能用. 坑二: 关于生命周期钩子 因为小程序的历史页面不会销毁,所以在生命周期 ...
- Linkerd 2.10(Step by Step)—配置超时
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- golang操作etcd
etcd是近几年比较火热的一个开源的.分布式的键值对数据存储系统,提供共享配置.服务的注册和发现,本文主要介绍etcd的安装和使用. etcd介绍 etcd是使用Go语言开发的一个开源的.高可用的分布 ...