YPlugin.class.php 3.73 KB
<?php
/**
 * 插件基类
 * 
 * 
 * @name Framework_YPlugin
 * @package framework
 * @since 0.1 (2012-12-24) <xiaoma>
 */
class Framework_YPlugin
{
    /**
     * 插件配置
     *
     * @var unknown_type
     */
    private static $_pluginsConfig = NULL ;
    
	/**
	 * 已注册的插件对象
	 *
	 * @var array
	 */
    private static $_plugins = NULL;
    
    /**
     * HTTP对象
     *
     * @var Framework_YHttpRequest
     */
    protected $_request = null ;
    
	/**
	 * 构造函数 
	 */
	protected function __construct()
	{
		$this->_request = Framework_YHttpRequest::instance();
	}
	
	
	/**
	 * 初始化函数(仅在初始化时调用 ,两次调用则只会在第一次有效,相当于构造函数)
	 *
	 * @param unknown_type $parames
	 */
	protected function init(){}
	
	/**
	 * 执行事件之前操作(每次执行 插件都会操作)
	 *
	 */
	protected function before_execute(){}
	
	/**
	 * 执行插件结束时调用 (每次执行 插件都会调用)
	 *
	 */
	protected function after_execute(){}
	
	/**
	 * 安装插件 - 供后台使用
	 *
	 */
	public function _install(){}
	
	/**
	 * 卸载插件 - 供后台使用
	 *
	 */
	public function _uninstall(){}
	
	/**
	 * 启动插件 - 供后台使用
	 */
	public function _start(){}
	
	/**
	 * 停止插件 - 供后台使用
	 */
	public function _stop(){}
	
	/**
	 * 是否开启该插件
	 *
	 * @return boolean
	 */
	public function _open()
	{
	    return true ;
	}
	
	/**
	 * 注册插件列表/配置
	 *
	 * @param array $pluginConfig
	 */
	public static function importPlugins(array $pluginConfig)
	{
	    self::$_pluginsConfig = $pluginConfig ;
	}
	
	/**
	 * 获取插件配置
	 *
	 * @return unknown
	 */
	public static function getPluginsConfig()
	{
	    return self::$_pluginsConfig ;
	}
	
	/**
	 * 执行插件
	 * @FIXME  此处被支持了配置调用 ,也支持定义调用 ,需要权衡此功能,需优化
	 * @param string $action 	  执行的方法
	 * @param array  $params 	  参数
	 * @param string $params     强制调用的方法
	 * @return mixed
	 * @since 0.2
	 */
	public static function execute( $action, $params = null, $method = null)
	{
	    $_pluginsConfig = self::$_pluginsConfig ;
	    if(!$_pluginsConfig)
	    {
	        return NULL ;
	    }
	    
	    // 变量存放插件对象
    	$pluginObject = null;
    	
    	// 变量存放插件参数
    	$pluginParams = array();
    	foreach ($_pluginsConfig['event'][$action] as $name => $plugin)
    	{
    		// 定义注册的插件名
    		$name = 'Y_Plugin_' . $plugin;
    		// 判断是否已注册此插件, 已注册: 则直接取得, 未注册: 先初始化, 再注册.
    		if (isset(self::$_plugins[$name]))
    		{
    			// 取得注册过的插件
    			$pluginObject = self::$_plugins[$name];
    		}
    		else
    		{
    			$pluginParams = array();
    			if (! empty($_pluginsConfig['params'][$plugin]))
    			{
    				$pluginParams = $_pluginsConfig['params'][$plugin];
    			}
    			// 初始化插件
    			$pluginObject = new $plugin();
    		    //执行初始化动作
    		    $pluginObject->init( $pluginParams ) ;
    			// 注册插件
    			self::$_plugins[$name] = $pluginObject;
    		}
    		
    		$response = null ;
    		
    		//检测是否开启插件
    		if ($pluginObject->_open())
    		{
    		    $method = $method?$method:$action ;
        		//执行插件前处理
        		$pluginObject->before_execute() ;
        		// 执行插件事件
        		if (method_exists($pluginObject,$method))
        		{
        		    $response = $pluginObject->$method($params);
        		}
        		// 执行插件后处理
        		$pluginObject->after_execute() ;
    		}
    		
    		// 返回结果
    		if (!is_null( $response ) )
    		{
    			return $response;
    		}
    	}
	}
	
}