загрузчик кода 2.0.3 загрузчик add_package_path вид каскадирования - PullRequest
1 голос
/ 13 октября 2011

Я не уверен, правильно ли я это истолковываю, но, пожалуйста, поправьте меня. Я использую класс загрузчика Code Igniter для загрузки «пакета» приложения. По большей части работает нормально. Тем не менее, одна вещь, которая сбивает меня с толку, - это то, как пути представления работают (или не работают).

В документации (http://codeigniter.com/user_guide/libraries/loader.html), написано:

"По умолчанию пути к файлам представлений пакетов устанавливаются при вызове add_package_path (). Пути к представлениям циклически повторяются, и при обнаружении совпадения это представление загружается.

В этом случае возможно возникновение коллизий именования в пакетах и, возможно, некорректный загружаемый пакет. Чтобы избежать этого, установите необязательный второй параметр FALSE при вызове add_package_path (). "

Это пример кода, который они дают:

$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, я все еще получаю представление из внешнего пакета (имя представления существует как во внешнем пакете, так и в текущем приложении). Если посмотреть на класс Loader в /system/core/Loader.php, это определение 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 , Там не так много документации по этому вопросу, и я не видел отчетов об ошибках, поданных за это. Опять же, моя интерпретация заключается в том, что если 2-й параметр, переданный в add_package_path (), имеет значение FALSE, путь просмотра пакета должен быть пропущен. Я думаю, что в _ci_load () внутри проверки каскада должно быть продолжение, а не перерыв, и это должно предшествовать проверке файла.

Это ошибка, о которой я должен сообщить, или я что-то здесь неправильно интерпретирую, и функция работает так, как должна быть?

1 Ответ

1 голос
/ 20 июня 2012

Опечатка существует и к этой дате!Второй аргумент во втором примере кода должен был быть ЛОЖЬ.

Моя интерпретация использования:

Если вторым аргументом является ИСТИНА, то представление будет загружено ТОЛЬКО из внешнего пакета.

Если вторым аргументом является FALSE, то представление будет загружено из внешнего пакета или локального репозитория в зависимости от того, где оно найдено (сначала проверяя внешний пакет).Идея заключается в том, что если его нет во внешнем пакете, поиск должен продолжаться в локальном репо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...