我制作的这个装载机实际上运行得很好。我现在想让我的应用程序完全模块化。这将允许开发人员覆盖各个功能部分,并更容易扩展应用程序。
我最初想出了这个。
// 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
有谁知道最好的方法是调整上面的代码以找到任何深度的路线?
答案 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函数。那好吧。我想你会明白这个想法。