# 插件架构 * * * * * ### 什么是插件? 插件是用于扩展系统的功能的一些独立“组件”。 插件的定位是用于实现某些简单的显示及数据处理的功能扩展。所以我们的初衷是插件的开启关闭,不会影响原有数据。 物理定义: 位于站点根目录 /addon 下的一个类库,可以被系统的hook函数访问到。 ![](https://box.kancloud.cn/4142741fe833fbbb77024f61d38567df_278x327.png) * * * * * ### 什么是钩子? 讲到插件,不得不讲钩子。首先,插件是一个扩展的功能实现。 既然是扩展的,那么就要很灵活、可复用,并不是像我们之前开发项目,一个功能实现了,就写死在代码里了。 项目其他地方要用了,怎么办,复制一份改个名,改的那个地方能调用实现。这样一次两次可以,次数多了就不行了。 因为后面每次开发的底层架构在不断变化。不断重复的功能版本造成人力的浪费。我们做成插件的目的就是为了方便大家扩展我们这个产品的功能。到时候形成规模,大家自由的搭建自己的站点就方便了。 那么如何让一个扩展的功能在多个地方可随意的使用呢。那就用到了我们的钩子。 为什么叫它钩子呢?因为它的作用就是如此和生活中的钩子类似。 打个比方,我们做的网站比作一个有多个功能的立式衣架。 这个衣架给什么人用就有不同的用途。 假如你专门用来挂大衣的,那就是大衣衣架。如果你专门挂袋子,那就是一个储物衣架。 当你不想要某个挂件、衣服时,取下来即可。并不会破坏原有的袋子或者衣服的功能。 你挂与不挂,钩子就在那里。 为什么能挂那么多东西呢?说明被挂的东西都符合一个标准:能挂的住。 换作你挂一个橡皮泥、或者棉花之类的。挂不了多久就会掉了。因为他们不符合要有部分封闭的可固定的这一个部分的标准。 还有挂一个太重的比如10个背包挂一个钩子上。要么架子毁了,要么钩子断了。总之就是挂不住。 因为任何一个钩子都有其承重上限。你加起来的超过了,肯定不行。 所以我们不能把插件当成万能的使,什么东西都整成插件,不管功能的大小。 任何系统都有瓶颈,你不能把个重量级的东西做成插件后挂上,说不定以后就会影响整个站点。就违背了插件的独立性原则。那些就不应该做成插件而是做成模块或者服务扩展。 * * * * * ### OneBase插件结构 公共模块下有一个AddonBase类,此类继承自ControllerBase 说明是一个控制器的子类,所有插件的控制器都需要继承AddonBase类,在此类中重写了框架的fetch与_get方法,实现了像其他模块一样的模板渲染方式及依赖注入对象。 **注意:** 插件的业务逻辑层继承的是app\common\model\Addon 而 不是 app\common\logic\Addon。因为此处的继承只是为了实现模型层对象的注入,所以无需继承app\common\logic\Addon。逻辑层的Addon里面封装的是插件的执行,安装,卸载等机制。 在v1.2版本中插件的静态资源移动到了public/static/addon目录下,在插件的模板中使用 __STATIC __会自动定位到插件的静态资源目录中。 插件也不例外,作者建议尽量将业务逻辑封装在业务逻辑目录中,供控制器引用,数据库相关操作尽量封装在ModelBase中,供业务逻辑层引用。