【问题标题】:class name collision when using codeigniter 2.0 with Datamapper?将codeigniter 2.0与Datamapper一起使用时类名冲突?
【发布时间】:2011-07-07 19:05:17
【问题描述】:

我正在使用 CI2.0 和 PHP 5.3

我刚开始使用“Datamapper ORM”,非常棒!!但是它们是关于类名的一个大问题

我有一个名为“users”的数据库表,所以我的 dm 模型是“user”,而且我还有一个同名“user”的控制器?

所以在“用户”控制器中使用“用户”模型是不可能的!!

解决这个问题的最佳方法是什么?

非常感谢

最好的问候

【问题讨论】:

  • 如何将user 重命名为user_model

标签: php database codeigniter codeigniter-2 codeigniter-datamapper


【解决方案1】:

CodeIgniter 的一个缺点是您不能将控制器、模型或库命名为相同的东西。这主要是一个 PHP 问题,因为显然你不能命名任何相同的东西,但可以通过两种方式避免它。

  1. PHP 命名空间 - 不行,它们仅适用于 PHP 5.3,如果实施,90% 的社区都会启动。
  2. 控制器前缀 - 这是我很想添加的内容,但是……它会破坏所有人的东西。我们至少要等到 2.1 才能有这么大的变化。

目前我只能建议您仔细命名您的模型和库。

控制器 - 用户
图书馆 - 用户
模型 - User_model |用户_m

这很烦人,但现在只是其中之一。

【讨论】:

  • 谢谢,我想使用命名空间来解决这个问题,但是据我所知,使用 Datamapper 是不可能的,请参阅codeigniter.com/forums/viewthread/149380 再次感谢
  • 不,命名空间涉及从根本上改变 CodeIgniter 和 Datamapper 的工作方式,因此您 _m 在您的模型上。容易得多:)
【解决方案2】:

所以在 “用户”控制器是不可能的!

不,不是,您需要更仔细地查看用户指南;)

你可以给你的模型起一个不同于它最初定义的名字:

如果您希望分配您的模型 到不同的对象名称,你可以 通过第二个参数指定它 加载函数:

$this->load->model('Model_name', 'fubar');    
$this->fubar->function();

【讨论】:

  • 谢谢,我知道用户指南的这一部分,但是在我的情况下它不起作用,因为“DataMapper 模型与 CodeIgniter 模型非常不同。与 CI 模型不同,您永远不应该显式加载它们( Datamapper ORM 会自动处理),并且永远不应该将它们添加到自动加载中。” datamapper.wanwizard.eu/pages/models.html 您不会像其他 codeigniter 模型那样加载数据映射器模型,感谢您的尝试,我真的很感激
  • @Jakub 你的答案是错误的。@ahmed 询问了有关使用 codeIgniter 和 ORM 的问题。
【解决方案3】:

您需要做的就是将控制器文件名和类名更改为“用户”。您无需更改模型名称。

控制器:用户
型号:用户
数据库表:用户

看看Datamapper docs

【讨论】:

    【解决方案4】:

    我建议:

    • 控制器 - 用户或/和用户
    • 库 - Users_lib 或 Users_library 或 User_lib 或 User_library
    • 模型 - Users_model 或 Users_m 或 User_model 或 User_m

    为控制器保留“用户”和“用户”这两个词,以便您保留漂亮的网址。

    只需与模型和控制器的复数或单数使用保持一致即可。

    【讨论】:

      【解决方案5】:

      如果是这样的“项目”,我会命名:

      控制器:
      项目扩展 MY_Controller 扩展 CI_Controller

      型号:
      ProjectModel 扩展模型

      在视图中
      project/projectManager // 作为主要内容
      project/_projectItem // 带有_下划线作为子视图

      这一切都很好。

      【讨论】:

        【解决方案6】:

        我处理它的方式是用_controller结束我所有的控制器名称。

        我也使用 datamapper,所以我遇到了很多名称冲突。对于用户,我有一个用户(模型)和一个User_Controller

        然后我简单地添加:

        $route['user'] = 'user_controller';
        

        到 config/routes.php 文件,瞧。

        唯一的缺点是,如果你有一个包含很多页面的大型项目(比如我),你最终会得到一个巨大的 routes.php 文件,特别是如果你有很多具有很多参数的函数,路由可能会让人头疼。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多