如何做一个PHP钩子系统?

如何做一个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. *

如何在PHP应用程序中实现钩子系统,以便在执行之前或之后更改代码。对于PHPCMS(甚至是一个简单的应用程序),hookloader类的基本架构是什么。那么,如何将其扩展为完整的插件/模块加载程序呢


(还有,有关于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的经验中学到的最重要的方面是什么。。而且非常有效