Невозможно загрузить запрошенную ошибку класса только на сервере

У меня есть приложение CodeIgniter, и оно работает на моем локальном ноутбуке (Windows 7). Я загрузил файлы на удаленный сервер, и теперь он выдает ошибку Unable to load the requested class: itemblocklibrary.

Код, где загружается библиотека:

$ci =& get_instance();
$ci->load->helper('member_area_helper'); // works
$ci->load->library('itemBlockLibrary'); // dies here

Файл находится на удаленном сервере по адресу: /www/case/project/application/libraries/itemBlockLibrary.php

Я старался:

echo 'Have you seen ' . APPPATH . 'libraries/itemBlockLibrary.php? <br/>';
echo (file_exists(APPPATH . 'libraries/itemBlockLibrary.php') ? 'Yes sir, it does exists!' : 'No sir, can\'t find it');

Выход:

Have you seen application/libraries/itemBlockLibrary.php? 
Yes sir, it does exists!

А также:

  • используя нижний регистр $ci->load->library('itemblocklibrary'); -> та же ошибка
  • загрузка другой библиотеки -> та же ошибка
  • тройная проверка существования файла (FTP) -> есть ли
  • проверил права доступа к папкам и файлам. (папка: 755, файлы: 644; то же, что и папка помощников)

Может ли кто-нибудь помочь мне сохранить мои волосы? ;)


person Sven van Zoelen    schedule 09.03.2013    source источник
comment
Работают ли другие ссылки и внутренняя маршрутизация? Похоже на проблему с htaccess.   -  person Rick Calder    schedule 09.03.2013
comment
@RickCalder Только что попробовал, я могу перемещаться по некоторым страницам / маршрутам. Также проверил код рабочих страниц и увидел, что он использует только встроенные библиотеки и никаких пользовательских.   -  person Sven van Zoelen    schedule 09.03.2013
comment
Вы когда-нибудь догадывались об этом? У меня точно такая же проблема. :с   -  person m0dE    schedule 17.07.2014
comment
@ m0dE Извините, но это было слишком давно, чтобы я мог вспомнить, поэтому не могу вам помочь ..   -  person Sven van Zoelen    schedule 18.07.2014


Ответы (1)


Я подозреваю, что ваш сервер представляет собой разновидность Linux, и вы сталкиваетесь с чувствительностью к регистру. В вашем файле используется имя в верблюжьем регистре itemBlockLibrary.php, и он преобразуется во все первые буквы нижнего и верхнего регистра, чтобы найти соответствующий файл в каталоге с помощью класса CI_Loader.

Из класса Loader функция _ci_load_class:

// We'll test for both lowercase and capitalized versions of the file name
foreach (array(ucfirst($class), strtolower($class)) as $class)

Измените имя файла, чтобы использовать соглашение CI

  • Имена файлов должны быть написаны с заглавной буквы. Например: Myclass.php
  • Объявления классов должны быть написаны с заглавной буквы. Например: класс Myclass
  • Имена классов и имена файлов должны совпадать.

Ознакомьтесь с документацией по классам пользовательской библиотеки.

В вашем случае вы захотите назвать свой файл как MY_itemblocklibrary.php (или любой другой префикс, который вы установили в своем файле конфигурации), а затем загрузить его как:

$this->load->library('MY_itemblocklibrary');
person Wolf    schedule 09.03.2013
comment
Когда я меняю имя класса и имя файла на все строчные буквы, это все равно не работает. Когда я добавляю MY_ перед именем файла и именем класса, это работает. Но тогда мне приходится многое переписывать в приложении, потому что $this->itemblocklibrary->method() строки больше не будут работать. Так что это скорее обходной путь. Настоящая проблема заключается в том, что он не хочет загружать файлы в библиотеках папок, когда они названы без MY_. - person Sven van Zoelen; 10.03.2013
comment
У вас есть два варианта. Вы можете попробовать установить $config['subclass_prefix'] в '' пустую строку; в документации указано, что этот префикс позволяет вам расширять собственные библиотеки, но, поскольку вы создаете свой собственный класс, просто попробуйте удалить его. Или вы можете передать псевдоним объекта в качестве третьего аргумента классу загрузчика: $this->load->library('MY_itemblocklibrary',array(),'itemBlockLibrary'); - person Wolf; 10.03.2013