我不确定我是否在解释这个错误,但如果我是的话,请纠正我。我正在使用Code Igniter的Loader类来加载应用程序“包”。它在大多数情况下工作正常。但是,有一件事让我感到震惊的是视图路径是如何工作的(或者不工作)。
在文档(http://codeigniter.com/user_guide/libraries/loader.html)中,它说:
“默认情况下,在调用add_package_path()时会设置包视图文件路径。视图路径是循环的,一旦遇到匹配,就会加载该视图。
在这种情况下,可能会发生包内的视图命名冲突,并且可能会加载错误的包。要确保不这样做,请在调用add_package_path()时设置可选的第二个参数FALSE。“
这是他们提供的示例代码:
$this->load->add_package_path(APPPATH.'my_app', TRUE);
$this->load->view('my_app_index'); // Loads
$this->load->view('welcome_message'); // Will not load the default welcome_message b/c the second param to add_package_path is TRUE
// Reset things
$this->load->remove_package_path(APPPATH.'my_app');
// Again without the second parameter:
$this->load->add_package_path(APPPATH.'my_app', TRUE);
$this->load->view('my_app_index'); // Loads
$this->load->view('welcome_message'); // Loads
我认为示例代码中存在拼写错误,它们意味着将FALSE传递给第二次调用add_package_path()。我对此的解释是,如果传入FALSE,则应跳过包的视图路径,并应使用原始视图路径。
但是,当我实际尝试传入FALSE时,我仍然从外部包中获取视图(视图名称存在于外部包和当前应用程序中)。查看/system/core/Loader.php中的Loader类,这是add_package_path()的定义:
public function add_package_path($path, $view_cascade=TRUE)
{
$path = rtrim($path, '/').'/';
array_unshift($this->_ci_library_paths, $path);
array_unshift($this->_ci_model_paths, $path);
array_unshift($this->_ci_helper_paths, $path);
$this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths;
// Add config file path
$config =& $this->_ci_get_component('config');
array_unshift($config->_config_paths, $path);
}
它的作用是将包视图路径添加到视图路径数组的前面,其值为TRUE或FALSE。在实际加载视图的函数中,也在Loader类中并调用_ci_load($ _ ci_data),这是它选择要查看的视图路径的段:
foreach ($this->_ci_view_paths as $view_file => $cascade)
{
if (file_exists($view_file.$_ci_file))
{
$_ci_path = $view_file.$_ci_file;
$file_exists = TRUE;
break;
}
if ( ! $cascade)
{
break;
}
}
在我看来,如果视图存在于外部包中(因为它将位于调用add_package_path的数组之外),无论add_package_path中的第二个参数是TRUE还是FALSE,它都将被加载。没有太多关于此的文档,我没有看到任何针对此提交的错误报告。同样,我的解释是,如果传入add_package_path()的第二个参数为FALSE,则应跳过包的视图路径。我想在_ci_load()中,在cascade检查中应该是一个continue而不是break,它应该在检查文件之前。
这是我应该报告的错误,还是我在这里错误地解释了某些内容并且该功能正常运行?
答案 0 :(得分:1)
此错误也存在于此日期!第二个代码示例中的第二个参数应为FALSE。
我对用法的解释是:
如果第二个参数为TRUE,则只能从外部包加载视图。
如果第二个参数为FALSE,则视图将从外部包或本地存储库加载,具体取决于它的位置(首先检查外部包)。这个想法是,如果它不在外部包中,搜索应该继续在本地仓库。