可能我们需要为joomla开发中间件组件 原
写了很多年的joomla组件,发现很多功能实际上都是通用的。比喻说通知功能,商城组件需要通知,订阅组件需要通知功能,OA组件需要通知功能,留言组件需要通知功能。并且这些通知的方法实际上都大同小异,无外乎就是邮件通知,站内信通知,短信通知,微信通知等等。这样就导致很多代码都是重复的。为了解决这个问题,我觉得需要开发一些专门用来提供中间服务的组件。这些组件单独安装没有实际的意义,必须供其他组件来调用。
中间件组件
在joomla开发中和中间件组件功能最类似的一个核心功能就是分类组件。在开发组件中使用分类非常的方便,无需要建立数据表,只需要传入一个自定义的key就可以为自己的组件来创建分类了。这极大的简化了开发,提高了代码的复用率,并且也给后台管理员统一的体验。
之前我开发的商城组件和订阅组件还有OA组件都用到了通知功能。实际上我们可以仿照分类组件来开发一个通用的通知组件,任何其他的组件需要通知功能的时候,只需要注册一下即可,然后将发送通知的任务交给通知组件。这样一方面其他的组件将不再为通知功能单独写代码了,另一方面也方便管理员进行统一的通知管理和配置。
如何接入不同的组件呢
joomla最大的优势就是组件化,模块化。并且这种模块化是非常极端的,即使是两个不同的公司都可以进行代码的模块化协同开发。这就导致了一个问题,功能的重复性,A组件需要通知功能,B组件需要通知功能,由于A,B组件都必须具备完整的功能,因此每一个都需要写一套通知代码,这就必然导致功能的重复,以及界面操作的不协调。下面就是一个典型的例子。应用市场的通知功能截图:
商城组件的通知截图:
虽然都是同一个公司开发,并且两个功能及其相似,但还是写了两套代码。
如何来改进呢?
此时,如果有一个公用的通知组件,A,B组件此时不需要关注通知功能的实现,只需要在通知的时候抛出一个事件,就可以完成通知了。而在joomla中抛出事件是非常简单的,只需要一行代码即可。
为此,我们开发一个单独的通知中心组件,这个组件将为系统中所有的组件提供通知服务。也就是说商城组件和应用市场组件现在已经不需要通知代码了。他只需要将具体的通知工作交由通知中心组件来处理。对于用户来说,商城组件和应用市场组件没有任何变化,点击系统通知还是出现本组件的通知列表。
具体代码上的改进有3点:
1,将原先的通知代码移除。取而代之的则是一个链接。如:index.php?option=com_znotice&view=items&extension=com_zmaxshop。这里的exension=com_zmaxshop就是key
2,在需要通知的地方触发事件。以便被插件响应。
$app = JFactory::getApplication(); $app->triggerEvent("onAfterSubmitorder",array($order));
3,写一个通知插件,注册需要通知的事件,并且说明可供用户配置的参数。
每一个组件都可以注册自己可供通知的事件.注册的方法只需要创建一个XML文件即可。另外,还需要配置一个事件解析器,其核心功能就是将通知内容的动态参数进行调换。至此,我们就完成了通知系统的接入。代码如下:
class znoticeEventAfterSubmitorder extends znoticeEventBase { public $type="aftersubmitorder"; //得到这个事件对外提供的所有参数以及他们的使用说明 //这里的说明是给人类看的 public function getOptions() { $options = array("ORDER_NO"=>"订单号", "ORDER_PRICE"=>"订单的金额", "USER_NAME"=>"提交者的名称", "ORDER_ITEMS"=>"订单的商品列表" ); return $options; } //解析这个事件提供的所有参数 public function formatContent($content) { $this->options=array("ORDER_NO"=>$this->data->no, "ORDER_PRICE"=>$this->data->price, "USER_NAME"=>$this->data->user->name, "ORDER_ITEMS"=>$orderItems ); return parent::formatContent($content); }
为什么以前没有这个想法?
之前开发的扩展比较零散,有时候时间比较紧就直接复制代码。中间件这个想法在我脑子里面出现了很久。只不过最近才实现。
还有哪些功能可以中间件?
支付功能,日志功能,通知功能。目前这三个功能我们已经完成了中间件的初步版本。后面测试稳定后将在应用市场中发布,可供广大开发者调用。