文档章节

框架中的钩子与插件的理解与应用

glen2012
 glen2012
发布于 2017/03/23 11:44
字数 1356
阅读 55
收藏 0

什么是插件?

插件的定位是用于实现某些简单的显示及数据处理的功能扩展。所以我们的初衷是插件的开启关闭,不会影响原有数据。通俗一点来讲,插件就是一个函数,用来实现一些小功能或者扩展。

什么是钩子?

讲到插件,不得不讲钩子。首先,我们之前说明了插件是一个扩展的功能实现。

既然是扩展的,那么就要很灵活、可复用,并不是像我们之前开发项目,一个功能实现了,就写死在代码里了。

项目其他地方要用了,怎么办,复制一份改个名,改的那个地方能调用实现。这样一次两次可以,次数多了就不行了。

因为后面每次开发的底层架构在不断变化。不断重复的功能版本造成人力的浪费。我们做成插件的目的就是为了方便大家扩展我们这个产品的功能。到时候形成规模,大家自由的搭建自己的站点就方便了。

那么如何让一个扩展的功能在多个地方可随意的使用呢。那就用到了我们的钩子。

为什么叫它钩子呢?因为它的作用就是如此和生活中的钩子类似。

打个比方,我们做的网站比作一个有多个功能的立式衣架。

这个衣架给什么人用就有不同的用途。

假如你专门用来挂大衣的,那就是大衣衣架。如果你专门挂袋子,那就是一个储物衣架。

当你不想要某个挂件、衣服时,取下来即可。并不会破坏原有的袋子或者衣服的功能。

你挂与不挂,钩子就在那里。

为什么能挂那么多东西呢?说明被挂的东西都符合一个标准:能挂的住。

换作你挂一个橡皮泥、或者棉花之类的。挂不了多久就会掉了。因为他们不符合要有部分封闭的可固定的这一个部分的标准。

还有挂一个太重的比如10个背包挂一个钩子上。要么架子毁了,要么钩子断了。总之就是挂不住。

因为任何一个钩子都有其承重上限。你加起来的超过了,肯定不行。

所以我们不能把插件当成万能的使,什么东西都整成插件,不管功能的大小。

任何系统都有瓶颈,你不能把个重量级的东西做成插件后挂上,说不定以后就会影响整个站点。就违背了插件的独立性原则。那些就不应该做成插件而是做成模型扩展或者应用扩展。

 

钩子与插件的结合使用

我们用Onethink来举例,documentSaveComplete 保存文档数据后的扩展钩子

 
  1. /**
  2. * 新增或更新一个文档
  3. * @param array $data 手动传入的数据
  4. * @return boolean fasle 失败 , int 成功 返回完整的数据
  5. * @author huajie <banhuajie@163.com>
  6. */
  7. public function update($data = null){
  8. /* 检查文档类型是否符合要求 */
  9. $res = $this->checkDocumentType( I('type'), I('pid') );
  10. if(!$res['status']){
  11. $this->error = $res['info'];
  12. return false;
  13. }
  14.  
  15. /* 获取数据对象 */
  16. $data = $this->create($data);
  17. if(empty($data)){
  18. return false;
  19. }
  20.  
  21. /* 添加或新增基础内容 */
  22. if(empty($data['id'])){ //新增数据
  23. $id = $this->add(); //添加基础内容
  24. if(!$id){
  25. $this->error = '新增基础内容出错!';
  26. return false;
  27. }
  28. } else { //更新数据
  29. $status = $this->save(); //更新基础内容
  30. if(false === $status){
  31. $this->error = '更新基础内容出错!';
  32. return false;
  33. }
  34. }
  35.  
  36. /* 添加或新增扩展内容 */
  37. $logic = $this->logic($data['model_id']);
  38. if(!$logic->update($id)){
  39. if(isset($id)){ //新增失败,删除基础数据
  40. $this->delete($id);
  41. }
  42. $this->error = $logic->getError();
  43. return false;
  44. }
  45.  
  46. hook('documentSaveComplete', array('model_id'=>$data['model_id']));
  47.  
  48. //行为记录
  49. if($id){
  50. action_log('add_document', 'document', $id, UID);
  51. }
  52.  
  53. //内容添加或更新完成
  54. return $data;
  55. }

在上面这个函数中我们可以看到这句 hook(‘documentSaveComplete’, array(‘model_id’=>$data[‘model_id’]));  这就是钩子,钩子都是提前在函数里面写好的。就比如一个衣架上面买回来就衣架有几个钩子在那里了。你用与不用都在那里。

接下来我们就可以写一个插件 ,插件的例子我们就不用Onethink了。比较复杂麻烦。因为插件简单的含义就是一个函数功能。通过上面的钩子我们可以知道,我们可以接收到一个参数$parm。所以函数可以这么写

 

 
  1. public function documentSaveComplete($parm){
  2. //do something
  3.  
  4. }

这样一个简单的插件就写好了。接下来我们如何让这个插件和钩子结合呢。那就是要把这个插件添加到这个钩子里面去。

这个实现要看自己的规划了。比如在wordpress 中是写在function的函数中 在实现函数的上面写add_action(“钩子名称”,实现函数名称);

比如在Thinkphp中,在框架初始化的时候,就加钩子hook(”钩子名称“,实现函数);

比如在Onethinkphp中,把插件和钩子对应关系保存到数据库,框架初始化的时候,添加进去。hook(”钩子名称“,实现函数);

钩子名称一定要已经有的钩子对应上,函数就是自己写的功能插件。

我们可以灵活运用。

本文转载自:http://www.liaoxiansheng.cn/?p=337

glen2012
粉丝 1
博文 6
码字总数 2097
作品 0
泉州
私信 提问
webpack4.0各个击破(7)—— plugin篇

作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高。本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学...

大灰狼的小绵羊哥哥
2018/09/02
0
0
《Nodejs开发加密货币》之二十七:开发通用的HTML组件

前言 人的懒惰常常是麻烦的开始。多数程序员都希望自己的工作一劳永逸,一次开发,到处使用,成了人人追逐的目标,我也不例外。最初写《Nodejs开发加密货币》系列文章,因为不喜欢设定好了去...

imfly
2016/09/14
0
0
【webpack进阶】可视化展示webpack内部插件与钩子关系📈

往期文章: 【webpack进阶】前端运行时的模块化设计与实现 【webpack进阶】使用babel避免webpack编译运行时模块依赖 引言 webpack的成功之处,不仅在于强大的打包构建能力,也在于它灵活的插...

AlienZHOU
2018/10/01
0
0
BeautyWe.js 一套专注于微信小程序的开发范式

一个简单的介绍 BeautyWe.js 是什么? 它是一套专注于微信小程序的企业级开发范式,它的愿景是: 让企业级的微信小程序项目中的代码,更加简单、漂亮。 为什么要这样命名呢? Write beautifu...

JerryC
06/10
0
0
探寻 webpack 插件机制

webpack 可谓是让人欣喜又让人忧,功能强大但需要一定的学习成本。在探寻 webpack 插件机制前,首先需要了解一件有意思的事情,webpack 插件机制是整个 webpack 工具的骨架,而 webpack 本身...

牧云云
2018/04/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部