[英]Codeigniter Class and filename case sensitive on Linux (centos)
I am running into a case-sensitive problem that I'm not able to wrap my head around it appears. 我遇到了一个区分大小写的问题,我无法绕过它。
This is what my file structure looks like. 这就是我的文件结构。 I am only entering the directories that I am working with, but I am in fact using a full-install of CI3.
我只是进入了我正在使用的目录,但实际上我正在使用CI3的完整安装。
/application
....
/controllers/
application_controller.php
/core/
MY_Controller.php
Public_controller.php
....
/models/
Application_model.php
....
Here is what the class definition syntax looks like: 以下是类定义语法的样子:
/application/core/My_Controller.php /application/core/My_Controller.php
class MY_Controller extends CI_Controller
{
function __construct()
{
parent::__construct();
}
}
/application/core/Public_Controller.php /application/core/Public_Controller.php
class Public_Controller extends MY_Controller
{
function __construct()
{
parent::__construct();
}
// Application logic here...
}
/application/controllers/application_controller.php /application/controllers/application_controller.php
class Application_controller extends Public_Controller
{
public function __construct()
{
parent::__construct();
}
// Application logic here...
}
Reading the docs, I see that I should name my classes something like: 阅读文档,我看到我应该将我的类命名为:
Foo_Controller.php
Then i've always (thought) that the class definition should match the file name. 然后我总是(认为)类定义应该与文件名匹配。 So:
所以:
class Foo_Controller extends Bar_Controller {
....
}
Then I either get a 500 error, or I get no errors, and a white page. 然后我得到500错误,或者我没有错误,还有一个白页。 When I work locally (mac) everything works perfectly.
当我在本地工作(mac)时,一切都很完美。 As of right now (using the syntax above) I am at least getting the default codeigniter 404 page.
截至目前(使用上面的语法)我至少得到了默认的codeigniter 404页面。 When use
使用时
error_log(__FILE__);
at the top of each class, all I am getting to is My_Controller.php
在每个班级的顶部,我得到的是
My_Controller.php
Thank you for any suggestions! 谢谢你的任何建议!
Codeigniter change log says Codeigniter 更改日志说
Changed filenaming convention (class file names now must be Ucfirst and everything else in lowercase ).
更改了filenaming约定(类文件名现在必须是Ucfirst , 其他所有内容都是小写的 )。
So you controllers and files name should be 所以你的控制器和文件名应该是
I myself don't like new naming convention CI-2 was better in this case. 我本人不喜欢新的命名惯例CI-2在这种情况下更好。
Note: 注意:
Controller name Public_Controller
(C uppercase) and file name Public_controller.php
may work but I prefer to keep both name same so controller name should be Public_controller
. 控制器名称
Public_Controller
(C大写)和文件名Public_controller.php
可能有效,但我更喜欢保持两个名称相同,因此控制器名称应为Public_controller
。
As @jagad89 said, your filename for application_controller.php
should be as the codeigniter upgrade guide specifies: "... must be named in a Ucfirst-like manner or in other words - they must start with a capital letter." 正如@ jagad89所说,
application_controller.php
的文件名应该与codeigniter升级指南一样: “......必须以类似Ucfirst的方式命名,换句话说 - 它们必须以大写字母开头。” so Application_controller.php
所以
Application_controller.php
Meaning all of your Controllers, Models, Libraries, and Drivers ( NOT HELPERS ) have to be named in this manner to be able to be used inside of codeigniter. 这意味着所有的控制器,模型库和驱动器( 未佣工 ) 都以这种方式被命名为能够笨的内部使用。
For sake of unity, your class definition should match the filename as you said. 为了统一,您的类定义应该与您所说的文件名匹配。
You should see the 500 errors in your log, at least on linux, at /var/log/apache2/error.log
which should help with your debugging process. 您应该在日志中看到500个错误,至少在linux上,在
/var/log/apache2/error.log
,这应该有助于您的调试过程。
my solution in the /application/core/ i create a MY_Loader.php (uppercase for MY_L) 我在/ application / core / i中的解决方案创建了一个MY_Loader.php(MY_L的大写)
I create a class MY_Loader with a copy of original function "model" 我用一个原始函数“模型”的副本创建了一个类MY_Loader
I comment the line "$model = ucfirst($model);" 我评论一行“$ model = ucfirst($ model);”
The code of /application/core/MY_Loader.php: /application/core/MY_Loader.php的代码:
class MY_Loader extends CI_Loader { /*this a copy of function model of the class CI_Loader from /system/core/Moader.php */ public function model($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 = ''; // Is the model in a sub-folder? If so, parse out the filename and path. if (($last_slash = strrpos($model, '/')) !== FALSE) { // The path is in front of the last slash $path = substr($model, 0, ++$last_slash); // And the model name behind it $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('The model name you are loading is the name of a resource that is already being used: '.$name); } if ($db_conn !== FALSE && ! class_exists('CI_DB', FALSE)) { if ($db_conn === TRUE) { $db_conn = ''; } $this->database($db_conn, FALSE, TRUE); } // Note: All of the code under this condition used to be just: // // load_class('Model', 'core'); // // However, load_class() instantiates classes // to cache them for later use and that prevents // MY_Model from being an abstract class and is // sub-optimal otherwise anyway. 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 exists, but doesn't declare class 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.$class.'.php'); if ( ! class_exists($class, FALSE)) { throw new RuntimeException($app_path.$class.".php exists, but doesn't declare class ".$class); } } } //~ $model = ucfirst($model);/*this the line that i comment*/ if ( ! class_exists($model, FALSE)) { foreach ($this->_ci_model_paths as $mod_path) { if ( ! file_exists($mod_path.'models/'.$path.$model.'.php')) { continue; } require_once($mod_path.'models/'.$path.$model.'.php'); if ( ! class_exists($model, FALSE)) { throw new RuntimeException($mod_path."models/".$path.$model.".php exists, but doesn't declare class ".$model); } break; } if ( ! class_exists($model, FALSE)) { throw new RuntimeException('Unable to locate the model you have specified: '.$model); } } elseif ( ! is_subclass_of($model, 'CI_Model')) { throw new RuntimeException("Class ".$model." already exists and doesn't extend CI_Model"); } $this->_ci_models[] = $name; $CI->$name = new $model(); return $this; } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.