写了很多年的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);
	}

为什么以前没有这个想法?

之前开发的扩展比较零散,有时候时间比较紧就直接复制代码。中间件这个想法在我脑子里面出现了很久。只不过最近才实现。

还有哪些功能可以中间件?

支付功能,日志功能,通知功能。目前这三个功能我们已经完成了中间件的初步版本。后面测试稳定后将在应用市场中发布,可供广大开发者调用。

 

 

 

作者: 樱木花道

Joomla程序员,从J1.5到J4.x始终都在做Joomla相关开发定制工作,有超过10年行业经验,国内Joomla扩展开发商ZMAX团队的核心成员

作者网站:ZMAX程序人

评论 (0)

  • 最新在前
  • 最佳在前