如何最好地扩展我的模块加载器?

时间:2010-11-19 16:48:38

标签: php file

我制作的这个装载机实际上运行得很好。我现在想让我的应用程序完全模块化。这将允许开发人员覆盖各个功能部分,并更容易扩展应用程序。

我最初想出了这个。

// Try to load a module
$file_path = $segments[1] . '/' . $segments[2] . '/' . ucwords($segments[2]) . '.php';
$paths = array (
    'third-party' => SYS . 'extensions/third-party/modules/',
    'core' => SYS . 'extensions/core/modules/'
);

foreach ( $paths as $path) {
    if ( file_exists($path . $file_path)) {
        require($path . $file_path);
        if ( class_exists($segments[2])) {
            $module = new $segments[2];
            $function = isset($segments[3]) ? $segments[3] : 'index';
            if (method_exists($module, $function)) {
                $variables = $this->Router->get_variables(3);

                // Define Module Path
                define("MODULE_PATH", $path . $segments[1] . '/' . $segments[2] . '/');

                return call_user_func_array(array($module, $function), $variables);
            }
        }
    }
}

它的工作原理如下。

如果您在网址中输入admin / user。在我的脚本的早期部分,它查找管理类。如果找到admin类,它会查找用户函数。如果找不到用户功能。调用上面的代码来查找模块。

此模块可在。

中找到

XXX /模块/管理/用户/ user.php的

上面的代码检查这个文件是否存在,检查该类是否存在,它确定应调用哪个函数,它检查该函数是否存在于该类中,然后调用该函数。

我想要做的是检查任何级别。

例如。

?管理员/用户/寄存器

这可以在。

找到

XXX /模块/管理/用户/注册/ Register.php

有谁知道最好的方法是调整上面的代码以找到任何深度的路线?

1 个答案:

答案 0 :(得分:0)

你最好的选择是(在初始化)浏览目标目录中的所有文件(id可能是模块的文件),并创建一个索引数组,它看起来像这样( for myFile .php,假设它在“modules / something / myDir / mySubdir / ”中:

[0] = "mySubdir"
[1] = "myDir"
[2] = "something"
[3] = "modules"

现在,当你有一个类似于你提供的例子的路径(?admin / user / register)时,使用这个函数,它应该在文件中找到一个匹配项,假设它们存储在和数组中,并且键有一个等于其文件名的值:

function hasMatch($file_path, $file_index){
    // file_path  = the requested file path, WITHOUT leading ? or any kind of
    //              character, not containing the actual filename, just path

    // file_index = index of the files, an array keyed with filenames, containing
    //              its super-directories

    // returns the full include path on success, otherwise FALSE

    $file_path_array = array_reverse(explode("/", $file_path));

    foreach ($file_index as $file_name => $file_in){
        $found_start = false;
        $found_end = -1;

        $pi = 0;
        for ($fi = 0; $fi < count($file_in); $fi++){
            if ($file_in[$fi] == $file_path_array[$pi]){
                if ($found_start == false){
                    $found_start = true;
                }
                $found_end = $pi;
                $pi++;
            } else if ($found_start != false){
                if ($found_end == count($file_path_array)){
                    // match
                    $ret = "";

                    foreach ($file_in as $file_dir){
                        $ret = $file_dir."/".$ret;
                    }

                    return $ret.$file_name;
                }
            }
        }
    }

    return false; // no match
}

您可能希望保存文件的索引,并仅在更改内容时刷新它,以提高性能。

另外,我还没有测试过上面的代码,所以可能存在一个小缺陷,或者我可能没有使用API​​函数。那好吧。我想你会明白这个想法。