Codeigniter控制器和具有相同名称的模型

时间:2012-03-24 01:08:41

标签: php model-view-controller codeigniter

我正在尝试一下这个评论的想法Code Igniter Controller/Model name conflicts

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

$class = $RTR->fetch_class();并改变如下:
$class = 'Controller' . $RTR->fetch_class();

现在更改控制器名称:

class ControllerUser extends CI_Controller { ...

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

4 个答案:

答案 0 :(得分:7)

我不会修改CodeIgniter的核心。当你升级时,你将失去这种变化。

我过去做过两件事: 1.将我的模型命名为User_model 2.将我的控制器命名为复数,将我的模型命名为单数。

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

您还可以在此处关注此问题的社区讨论:http://codeigniter.uservoice.com/forums/40508-codeigniter-reactor/suggestions/1269847-controller-prefixes

答案 1 :(得分:5)

要解决此问题,通常大多数人都会将“_model”后缀添加到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>";  

Source

答案 2 :(得分:1)

是的,这是有意义的。 Codeigniter是一个严格的面向对象框架。这意味着当您有2个或更多具有相同名称的对象时,该对象的名称不够独特。

在您的情况下,模型是数据处理器,控制器是将视图连接到模型的类。所以从逻辑上讲,你必须这样命名:

您的模型将是:“Model_User”,“Db_User”或“UserList”

您的控制器将是:“User”,Controller_User或UserController

在模型的情况下,我建议你使用Db_User(简短但清晰的名称),在控制器的情况下,我建议你使用“用户”(简短和定义用户的类,当它与模型和视图相结合时用户)

我在使用像我这样的Codeigniter系统时一直没有问题

答案 3 :(得分:1)

为什么不让你的控制器变得单一,你的模型/数据库表复数?