各位《云客drupal源码分析》系列的读者:
本系列一直以每周一篇的速度进行博客原创更新,希望帮助大家理解drupal底层原理,并缩短学习时间,但自《插件系统(上)》主题开始博客仅发布前言和目录,这是因为云客在思考一个问题:drupal在国外如此流行但在国内却很小众,一个重要原因应该是中文资料的缺乏,我们是否能够找到一种方式来激发中文资料的出产?此时同是积极推动者的晴空提出能否用付费阅读的方式来鼓励更多作者?并建立了一个付费阅读drupal资料的网站,个人觉得也许这能激发高质量原创内容的出产,学习者支付很少费用可以节省大量学习时间是划算的,作者也能分配精力去开发高质量内容而得到报酬,drupal普及开了对大家都有益处,为了支持晴空的这个项目,云客决定将从《插件系统(上)》主题开始后续内容全部放在这个网站上收费阅读,读者只需要付很少费用即可,云客在这里承诺该系列得到的所有订阅费用全部捐献给drupal深圳社区,用以组织活动等等,发展社区需要大家贡献力量,该网站已于2017年3月29日上线,请移步:http://nowicode.com/ 阅读本篇完整版
我是云客,【云游天下,做客四方】,联系方式见主页,欢迎转载,但须注明出处
****************************************以下为前言和目录,请移步:http://nowicode.com/ 阅读本篇完整版*******************************
插件系统是drupal中非常重要的一块内容,非常多的地方用到了它,本系列将分上下两篇来讲解它,上篇为基本内容,能一窥插件全貌和常见使用,下篇为高级使用
插件是什么?
在读本篇前强烈建议看完本系列前面关于钩子的介绍,插件本质上就是使用面向对象程序开发模式实现的钩子,但它比钩子系统更加先进灵活,钩子是相对于面向过程程序开发而言,狭义点讲,一个钩子就是一个函数,一个插件就是一个类。
他们都是在某个点来实现某类似功能,钩子比较简单,通过函数的命名规则来进行查找,而插件类则高级强大许多,一个类可能很大,系统中有许多插件,全部加载的话也会消耗大量内存,类可能也需要配置数据,如果通过命名来查找那么会限制其灵活性,所以依靠命名这种查找方式不适合插件系统,因此在drupal中使用插件类的元数据来查找插件,这个过程叫做插件的发现Discovery
插件的发现Discovery:
在drupal中提供了四种方式来查找插件,他们都是基于插件类的元数据:
1:StaticDiscovery
静态发现,其实很简单,就是将插件的元数据保存在一个对象的属性中,这个对象可以添加、查找元数据,进而通过元数据找到插件类
2:HookDiscovery
用钩子机制去获取插件类的元数据
3:AnnotatedClassDiscovery
释文发现机制,这也是drupal主要使用的发现机制,下文重点讲解
4:YamlDiscovery
将插件元数据保存在yaml文件中,在drupal核心中使用这种方式来进行本地任务
释文插件类发现机制:
这是drupal最主要使用的插件发现方法,它有个优点:将元数据和类放在一起,在我们写php程序的时候,可以用到行注释“//”和块注释“/* */”,释文发现机制就是利用了块注释,插件是一个类文件,我们将这个插件的元数据保存到类的块注释中,系统扫描插件目录,以字符串方式读取php文件内容(并不以php文件加载的方式,这样就节省了内存使用)然后解析出块注释里面的元数据,就可以通过这些元数据找到对应的插件类了,你可能会问那且不是要进行巨大的计算量?确实如此,但别忘了有缓存,因此这样的计算只会进行一次,况且元数据可以携带许多参数,所以释文发现机制是比较不错的。下面来看一看drupal的具体实现:
预备知识:
释文对象:
插件系统的构成:
插件管理器:
插件定义:
释文语法:
定义释文对象:
默认插件管理器DefaultPluginManager:
附属内容: