Php Codeigniter控制器和同名collison模型

Php Codeigniter控制器和同名collison模型,php,model-view-controller,codeigniter,Php,Model View Controller,Codeigniter,我想尝试一下这个评论的想法 在core/CodeIgniter.php上查找类名变量: $class=$RTR->fetch_class()并像这样更改: $class='Controller'$RTR->fetch_class() 现在更改控制器名称: class ControllerUser扩展CI_控制器{… 它是有效的,现在我可以使用用户模型和用户控制器。但我的问题是,它有意义吗?还是有问题?(对不起,我的英语不好)这很有意义。Codeigniter是一个严格的面向对象框架。这意味着当你

我想尝试一下这个评论的想法

在core/CodeIgniter.php上查找类名变量:

$class=$RTR->fetch_class()并像这样更改:
$class='Controller'$RTR->fetch_class()

现在更改控制器名称:

class ControllerUser扩展CI_控制器{…


它是有效的,现在我可以使用用户模型和用户控制器。但我的问题是,它有意义吗?还是有问题?(对不起,我的英语不好)

这很有意义。Codeigniter是一个严格的面向对象框架。这意味着当你有两个或多个同名对象时,对象的名称不够唯一

在您的情况下,模型是一个数据处理器和一个控制器,它是连接视图和模型的类。因此,从逻辑上讲,您必须将其命名为以下名称:

您的模型将是:“模型用户”、“数据库用户”或“用户列表”

您的控制器将是:“用户”、“控制器\用户”或“用户控制器”

对于模型,我建议您使用Db_User(简短但清晰的名称),对于控制器,我建议您使用“User”(short和在与该用户的模型和视图组合时定义该用户的类)


我从来没有遇到过使用像这样的Codeigniter系统来解决这个问题的问题,通常大多数人都会在模型类名中添加“\u model”后缀

我认为最好给控制器添加一个后缀,因为在代码中它们的类名几乎从不引用它们

首先,我们需要扩展Router类

创建此文件:“application/libraries/MY_Router.php”

class MY_Router extends CI_Router {
    var $suffix = '_controller';

    function __construct() {
        parent::CI_Router();
    }

    function set_class($class) {
        $this->class = $class . $this->suffix;
    }

    function controller_name() {

        if (strstr($this->class, $this->suffix)) {
            return str_replace($this->suffix, '', $this->class);
        }
        else {
            return $this->class;
        }

    }
}
现在编辑“system/codeigniter/codeigniter.php”

第153行:

if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT))  
第158行:

include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT);  
接下来,编辑:“system/libraries/Profiler.php”,第323行:

$output .= " 
<div style="color:#995300;font-weight:normal;padding:4px 0 4px 0">".$this->CI->router->controller_name()."/".$this->CI->router->fetch_method()."</div>";  
$output.=”
“$this->CI->router->controller_name()。”/“$this->CI->router->fetch_method()。”;


我不会修改CodeIgniter的核心。当你升级时,你会失去更改

我过去做过两件事: 1.命名为“我的模型”用户\u模型 2.将我的控制器命名为复数,将我的模型命名为单数

我现在做的是后者。这在语义上也有意义,因为控制器名称在URL中,所以路径看起来像app_path/users/username。此外,该模型通常为单个用户建模,因此也有意义


你也可以关注社区对这个问题的一些讨论:

为什么不把你的控制器设为单数,把模型/数据库表设为复数?

我用的是datamapper,所以我不想把用户设为模型。但是,是的,模型用户,控制器用户可以。我也发现了这一点。你怎么看?就#2而言,到目前为止mak是的,我认为这对SEO更友好一些,但我想获得更多关于这方面的参考。@musa,这是hmvc解决方案,请检查我的编辑和更新是否应该是
parent::\u construct()
?自从PHP5以来,您执行构造的方式发生了变化……然后CI仍然是半php4框架。@tereško,您是对的,我没有修改源页面的内容。但是您有一个很好的观点,我更新了它。Thanks@Starx您如何看待这个解决方案:只需一个MY_Router类,无需核心编辑。@musa,我喜欢它,但上面的hack在请求之间的遍历较少。这就是为什么你应该尝试找到一个允许你使用PHP5.3的框架。虽然我非常讨厌这个框架,但FuelPHP可能是你的逻辑步骤。它是一个全新的CI fork。当然,如果你能控制使用哪个框架,或者你正处于w这是可能的。如果不是..就在你开始下一个项目时考虑一下吧。不知道你从哪里得到的想法。FuelPHP是CI的一个分支。它不是,是从头开始构建的,与CI没有任何共同点,也不兼容。我不使用复数,因为我说的是列表或表。例如,用户严格来说是spok表的性质