code igniter 2.0.3 loader add_package_path view cascading

时间:2011-10-13 19:56:53

标签: php codeigniter

我不确定我是否在解释这个错误,但如果我是的话,请纠正我。我正在使用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,它应该在检查文件之前。

这是我应该报告的错误,还是我在这里错误地解释了某些内容并且该功能正常运行?

1 个答案:

答案 0 :(得分:1)

此错误也存在于此日期!第二个代码示例中的第二个参数应为FALSE。

我对用法的解释是:

如果第二个参数为TRUE,则只能从外部包加载视图。

如果第二个参数为FALSE,则视图将从外部包或本地存储库加载,具体取决于它的位置(首先检查外部包)。这个想法是,如果它不在外部包中,搜索应该继续在本地仓库。