Я столкнулся с проблемой, чувствительной к регистру, и я не могу обернуть ее вокруг.
Вот как выглядит моя файловая структура. Я только вхожу в каталоги, с которыми я работаю, но на самом деле я использую полную установку 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;
}
}