简体   繁体   English

Codeigniter类和文件名区分大小写在Linux(centos)

[英]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 所以你的控制器和文件名应该是

  • My_controller (only M upper case rest lower case) My_controller(仅M大写小写休息小写)
  • Public_controller Public_controller
  • Application_controller Application_controller
  • Foo_controller Foo_controller

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM