Codeigniter Класс и имя файла, чувствительные к регистру Linux (centos)

Я столкнулся с проблемой, чувствительной к регистру, и я не могу обернуть ее вокруг.

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

Таким образом, вы должны иметь имя контроллеров и файлов.

  • My_controller (только нижний регистр для нижнего регистра с верхним регистром)
  • Public_controller
  • application_controller
  • Foo_controller

Я сам не люблю новое соглашение о присвоении имен 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;
     }   
 }