如何做一个PHP钩子系统?
如何在PHP应用程序中实现钩子系统,以便在执行之前或之后更改代码。对于PHPCMS(甚至是一个简单的应用程序),hookloader类的基本架构是什么。那么,如何将其扩展为完整的插件/模块加载程序呢如何做一个PHP钩子系统?,php,plugins,module,content-management-system,hook,Php,Plugins,Module,Content Management System,Hook,如何在PHP应用程序中实现钩子系统,以便在执行之前或之后更改代码。对于PHPCMS(甚至是一个简单的应用程序),hookloader类的基本架构是什么。那么,如何将其扩展为完整的插件/模块加载程序呢 (还有,有关于CMS钩子系统的书籍或教程吗?您可以根据需要构建事件系统 /** * Attach (or remove) multiple callbacks to an event and trigger those callbacks when that event is called. *
(还有,有关于CMS钩子系统的书籍或教程吗?您可以根据需要构建事件系统
/**
* Attach (or remove) multiple callbacks to an event and trigger those callbacks when that event is called.
*
* @param string $event name
* @param mixed $value the optional value to pass to each callback
* @param mixed $callback the method or function to call - FALSE to remove all callbacks for event
*/
function event($event, $value = NULL, $callback = NULL)
{
static $events;
// Adding or removing a callback?
if($callback !== NULL)
{
if($callback)
{
$events[$event][] = $callback;
}
else
{
unset($events[$event]);
}
}
elseif(isset($events[$event])) // Fire a callback
{
foreach($events[$event] as $function)
{
$value = call_user_func($function, $value);
}
return $value;
}
}
添加一个事件
event('filter_text', NULL, function($text) { return htmlspecialchars($text); });
// add more as needed
event('filter_text', NULL, function($text) { return nl2br($text); });
// OR like this
//event('filter_text', NULL, 'nl2br');
那就这样说吧
$text = event('filter_text', $_POST['text']);
event('filter_text', null, false);
或者像这样删除该事件的所有回调
$text = event('filter_text', $_POST['text']);
event('filter_text', null, false);
下面是另一个解决方案: 创建钩子 无论您想在何处创建钩子,都可以运行此操作:
x_do_动作('header_scripts')代码>
将函数附加到挂钩上
然后通过执行以下操作将功能附加到上述功能上:
x_add_action('header_scripts','my_function_attach_header_scripts');
function my_function_attach_header_scripts($values) {
/* add my scripts here */
}
用于存储所有挂钩/事件的全局变量
将其添加到主PHP函数文件或等效文件的顶部
$x_events = array();
global $x_events;
基函数
这个解决方案存在一些问题,您不能为一个可调用的钩子设置多个函数。
您可以搁置此代码
$action=[];
函数apply($hook,$args){
全球行动;
$action[$hook]['args']=$args;
返回doa($hook,$args);
}
函数add($hook,$func){
全球行动;
$action[$hook]['funcs'][]=$func;
}
函数doa($hook,$args){
全球行动;
if(isset($action[$hook]['funcs'])){
foreach($action[$hook]['funcs']作为$k=>$func){
调用用户函数数组($func,$args);
}
}
}
add('this_是,'addOne');
函数addOne($user){
echo“这是测试添加一个$user
”;
}
添加('this_is',function(){
echo“这是测试添加两个
”;
});
添加('this_is_2','addTwo');
函数addTwo($user,$name){
回显$user.'.$name.
;
}
功能测试(){
回音“你好,
”;
应用('this_is',['user'=>123]);
}
函数test2(){
回音“你好,两位”
;
应用('this_is_2',['user'=>123,'name'=>'mohammad']);
}
test();
test2();
可能重复的内容无法回答您的问题-但另一种选择是。。。在脚本开始时创建模板对象,在整个执行过程中加载不同的对象,方法是使用控制器传递它们或使用模板工厂启动它们(我在控制器中使用它)。然后,将模板编译成您希望它们在结尾处的样子。你也可以指向自定义样式表。你能为这个问题提供自己的见解吗?你问这个问题已经有一段时间了,我很想知道你从自己编写一个如此简单的定制CMS的经验中学到的最重要的方面是什么。。而且非常有效