CI的扩展机制
在熟悉了CI的源码之后,它的简单明了的代码风格很有趣,这篇文章看看在CI是如何实现扩展的.
扩展包
扩展是为了完成特定的功能,在CI中,扩展包的开发只能在application/libraries
下.CI并没有对扩展进行任何限定,所以在CI开发扩展是不没有学习成本的.
扩展是与Controller通讯的,所以调用方式是这样:$this->load->library('newLibrary')
.可以查看CI中系统的library:一个扩展基本上只有一个类来完成,虽然用到了类,但并没有完全执行面向对象的中开发原则,仔细地看代码可以发现,这些类基本上都是面向过程的(面向对象与面向过程编程的核心区别在于职责的分配),也就只做了封装.从这一点可以看出来,library的目的只是为了实现CI的设计与架构目标.所以拒绝了复杂的面向对象.
所以,开发起来就只有一个需要注意的--尽量用一个类文件来完成
对系统进行扩展
CI是以简明著称,它所提供的功能足以满足使用该框架的需要,但特殊情况不可避免,有时候需对CI系统进行一点小小的改动,这时,就需要对该系统进行扩展了,如何解决?这一点CI已经为我们开放了接口--扩展框架核心
要能使用它所提供的功能,就需明白"钩子","挂钩点".
钩子
这个名称起的好,该名称很好的展现了在系统中"钩子"的作用.与在生活中的使用场景一样,钩子就是用来勾住东西的.在系统中一样,钩子用来勾住需要的类,用类做点什么,所以示例中是所展现的意思就很清晰了
$hook['pre_controller'][] = array(
'class' => 'MyClass',
'function' => 'MyMethod',
'filename' => 'Myclass.php',
'filepath' => 'hooks',
'params' => array('beer', 'wine', 'snacks')
);
挂钩点
钩子必须要属于谁,就像一个鱼钩钓起来的鱼当然属于这个钓鱼的人了,所以系统的中"钩子"就属于"挂钩点",这样,我们就可以通过"挂钩点"使用这个钩子.
为什么要这样做? 在CI中,框架并大量没有运用面向对象,所以钩子这个概念是面向对象中观察者模式的一个非面向对象的实践.这个概念在wordpress中同样存在,同样wordpress也未大量使用面向对象.
总结
CI中的扩展分为以上两种,要理解起来并不难,熟悉熟悉它的代码风格就比较容易理解各部分的工作机制了.