Я столкнулся с проблемой, чувствительной к регистру, и я не могу обернуть ее вокруг.
Вот как выглядит моя файловая структура. Я только вхожу в каталоги, с которыми я работаю, но на самом деле я использую полную установку CI3.
/application .... /controllers/ application_controller.php /core/ MY_Controller.php Public_controller.php .... /models/ Application_model.php ....
Вот как выглядит синтаксис определения класса:
/application/core/My_Controller.php
class MY_Controller extends CI_Controller { function __construct() { parent::__construct(); } }
/application/core/Public_Controller.php
class Public_Controller extends MY_Controller { function __construct() { parent::__construct(); } // Application logic here... }
/application/controllers/application_controller.php
class Application_controller extends Public_Controller { public function __construct() { parent::__construct(); } // Application logic here... }
Читая документы, я вижу, что я должен назвать свои классы чем-то вроде:
Foo_Controller.php
Тогда я всегда (думал), что определение класса должно совпадать с именем файла. Так:
class Foo_Controller extends Bar_Controller { .... }
Тогда я либо получаю ошибку 500, либо не получаю никаких ошибок, а белую страницу. Когда я работаю локально (mac), все работает отлично. На данный момент (используя синтаксис выше) я, по крайней мере, получаю страницу codeigniter 404 по умолчанию. При использовании
error_log(__FILE__);
в верхней части каждого класса, все, что я получаю, это My_Controller.php
Спасибо за любые предложения!
В журнале изменений Codeigniter говорится:
Изменено соглашение об именах файлов (имена файлов классов теперь должны быть Ucfirst и все остальное в нижнем регистре ).
Таким образом, вы должны иметь имя контроллеров и файлов.
Я сам не люблю новое соглашение о присвоении имен CI-2 в этом случае было лучше.
Заметка:
Имя контроллера Public_Controller
(C Public_Controller
) и имя файла Public_controller.php
могут работать, но я предпочитаю, чтобы оба имени были одинаковыми, поэтому имя контроллера должно быть Public_controller
.
Как сказал @ jagad89, ваше имя файла для application_controller.php
должно быть таким, как указано в руководстве по обновлению codeigniter: «… должно быть названо как Ucfirst-like, или, другими словами, они должны начинаться с заглавной буквы». поэтому Application_controller.php
Значение всех ваших контроллеров, моделей, библиотек и драйверов ( NOT HELPERS ) должно быть названо таким образом, чтобы его можно было использовать внутри codeigniter.
Для единства ваше определение класса должно соответствовать имени файла, как вы сказали.
Вы должны увидеть 500 ошибок в вашем журнале, по крайней мере на linux, в /var/log/apache2/error.log
которые должны помочь в процессе отладки.
мое решение в / application / core / i создает MY_Loader.php (верхний регистр для MY_L)
Я создаю класс MY_Loader с копией оригинальной функции "model"
Я прокомментирую строку «$ model = ucfirst ($ model)»;
Код /application/core/MY_Loader.php:
класс MY_Loader расширяет CI_Loader { / * это копия функциональной модели класса CI_Loader из /system/core/Moader.php * / публичная функциональная модель ($ model, $ name = '', $ db_conn = FALSE) { if (empty ($ model)) { return $ this; } elseif (is_array ($ model)) { foreach ($ model as $ key => $ value) { is_int ($ key)? $ this-> model ($ value, '', $ db_conn): $ this-> model ($ key, $ value, $ db_conn); } return $ this; } $ path = ''; // Является ли модель в подпапке? Если это так, проанализируйте имя файла и путь. if (($ last_slash = strrpos ($ model, '/'))! == FALSE) { // Путь перед последней косой чертой $ path = substr ($ model, 0, ++ $ last_slash); // И название модели за ней $ model = substr ($ model, $ last_slash); } if (empty ($ name)) { $ name = $ model; } if (in_array ($ name, $ this -> _ ci_models, TRUE)) { return $ this; } $ CI = & get_instance (); if (isset ($ CI -> $ name)) { throw new RuntimeException ('Имя модели, которое вы загружаете, - это имя ресурса, который уже используется:'. $ name); } if ($ db_conn! == FALSE &&! class_exists ('CI_DB', FALSE)) { if ($ db_conn === TRUE) { $ db_conn = ''; } $ this-> database ($ db_conn, FALSE, TRUE); } // Примечание: весь код при этом условии был справедливым: // // load_class ('Model', 'core'); // // Однако load_class () создает экземпляры классов // кэшировать их для последующего использования и // MY_Model от абстрактного класса и // В любом случае, под-оптимальным. if (! class_exists ('CI_Model', FALSE)) { $ app_path = APPPATH.'core'.DIRECTORY_SEPARATOR; if (file_exists ($ app_path.'Model.php)) { require_once ($ app_path.'Model.php '); if (! class_exists ('CI_Model', FALSE)) { throw new RuntimeException ($ app_path. Model.php существует, но не объявляет класс CI_Model "); } } elseif (! class_exists ('CI_Model', FALSE)) { require_once (BASEPATH.'core'.DIRECTORY_SEPARATOR.'Model.php '); } $ class = config_item ('subclass_prefix'). 'Model'; if (file_exists ($ app_path. $ class. '. php')) { require_once ($ APP_PATH $ класса. 'PHP.'); if (! class_exists ($ class, FALSE)) { throw new RuntimeException ($ app_path. $ class. ". php существует, но не объявляет класс". $ class); } } } // ~ $ model = ucfirst ($ model); / * это строка, которую я комментирую * / if (! class_exists ($ model, FALSE)) { foreach ($ this -> _ ci_model_paths как $ mod_path) { if (! file_exists ($ mod_path.'models /'.$ путь. $ model. '. php')) { Продолжать; } require_once ($ mod_path.'models /'.$ путь $ модель.. 'PHP.'); if (! class_exists ($ model, FALSE)) { throw new RuntimeException ($ mod_path. "models /".$ path. $ model.". php существует, но не объявляет класс ". $ model); } ломать; } if (! class_exists ($ model, FALSE)) { throw new RuntimeException ('Невозможно найти указанную модель:'. $ model); } } elseif (! is_subclass_of ($ model, 'CI_Model')) { throw new RuntimeException («Класс». $ model. «уже существует и не расширяет CI_Model»); } $ this -> _ ci_models [] = $ name; $ CI -> $ name = new $ model (); return $ this; } }