YPlugin.class.php
3.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
<?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;
}
}
}
}