Запускатель кода третьей стороны, $ this-> load-> add_package_path работает некорректно

#php #codeigniter #loader

#php #codeigniter #загрузчик

Вопрос:

Я пытаюсь использовать систему общения elliotaughins для code igniter,

Однако я продолжаю получать

Сообщение: включить (application/third_party/config/socializenetworks.php ): не удалось открыть поток: нет такого файла или каталога

Я отследил эту проблему, и когда я вызываю
$this->load->add_package_path(APPPATH.'third_party/socialize/');

В классе loader, если я это сделаю, die($path) я получу только application/third_party .

Это кажется странным, хотя, поскольку код для контроллера

 class SocializeController extends CI_Controller {

  function __construct(){
    parent::__construct();
    parse_str($_SERVER['QUERY_STRING'], $_GET);
    $this->load->add_package_path(APPPATH.'third_party/socialize/');
    $this->_autoload();
  }

  private function _autoload(){
    $this->load->model('socialize_migration_model');
    $autoload = array();

    include(APPPATH.'third_party/socialize/config/autoload'.EXT);
    foreach ( $autoload as $type => $files ) {
      $type = ($type == 'libraries') ? 'library' : $type;

      foreach ( $files as $file ){
        $this->load->$type($file);
      }
    }
  }

  public function data($key, $value)
  {
    $this->load->vars(array($key => $value));
  }
}
  

Который, как вы можете видеть, вызывает модель, которую он успешно загружает,
Это происходит, когда он попадает в автозагрузчик, где он загружает библиотеки, где он ломается,

Конкретная библиотека, которая выдает проблему, начинается как

 class SocializeNetworks {

  private $_obj;
  private $_networks = array();

  function __construct(){
    $this->_obj =amp; get_instance();
    $this->_obj->load->config('socializenetworks'); // this is the line we die on :(
  

Итак,

Что здесь происходит и как я могу это исправить?

Комментарии:

1. Он пытается включить файл, расположенный в application/third_party/config/ , но ваш сторонний модуль, похоже, находится в APPPATH.'third_party/socialize/ . У вас есть существующая application/third_party/config/ папка? Что в нем?

2. Должно быть, это ошибка, идея сторонних папок заключается в том, что вы можете развернуть весь набор, библиотеки, помощники, модели, конфигурационные файлы, представления в ОДНОЙ папке, если вам нужно взять свои конфигурационные файлы из этой папки, это противоречит цели…

Ответ №1:

Я проследил это до вчерашней ошибки в базе кода CI v2.0.2. По сути, происходит то, что вы добавляете дополнительный путь для проверки наличия файлов (который является правильным), и метод load перебирает каждый из путей, пока не найдет файл, который вы ищете.

Если вы выведете свой объект CI, вы, вероятно, увидите, что то, что вы ищете, есть, но он по-прежнему не работает.

В файле /codeigniter/core/Config.php там, где используется метод load, по какой-то причине значение $found=false; не сбрасывается на каждой итерации цикла path, поэтому, если путь найден при первом запуске (как это было в моем случае), то для $found устанавливается значение true, но затем при последующих запусках значение $found по-прежнему равно true, поэтому он пытается включить несуществующий файл.

Я решил это, переместив объявление переменной $found чуть ниже начала первого цикла foreach. Таким образом, он сбрасывает его каждый раз. Я сообщил об ошибке, так что, надеюсь, она будет исправлена в последующих версиях.