【问题标题】:CodeIgniter MVC: multiple models per controller?CodeIgniter MVC:每个控制器有多个模型?
【发布时间】:2015-06-24 21:33:25
【问题描述】:

我被推进了一个现有的 CodeIgniter 项目,并且正在熟悉他们的 MVC 方法的正确约定。我坚持的一件事是关联模型和控制器。 CI 文档对此几乎没有提供任何指导,我不确定正确的方法是什么。我们的项目是一个由外部应用程序调用的 API,所以我不关心视图,只关心模型和控制器。

这是一个现成的例子,而不是一个实际的例子,但希望它能帮助我理解:假设我正在制作一个包含迷你游戏和虚拟商店的应用程序。玩家可以通过玩小游戏来赚取积分。他们可以在商店里用这些积分购买物品。他们还可以在商店中出售商品以赚取积分。应用程序应记录每笔积分交易。

在这种情况下,我的想法是:

  • ShopModel - 与数据库交互以加载产品数据并保存用户购买的商品
  • MiniGameModel - 与数据库交互以加载有关迷你游戏的数据并保存分数
  • PointsModel - 与数据库交互以将积分转入或转出玩家帐户(并在“日志”表中写入相应的日志条目)

  • ShopController - 利用 ShopModel 和 PointsModel

  • MiniGameController - 利用 MiniGameModel 和 PointsModel

例如,用户告诉应用程序他们想在商店中搜索“武器”。该应用程序向控制器请求武器。商店控制器构建查询,商店模型执行查询并返回记录。控制器将记录格式化为 JSON 并将它们发送回应用程序。

用户告诉应用程序他们想购买盾牌。应用程序通知商店控制器。店主从店铺模型中查询价格,然后告诉积分模型减去积分,然后告诉店铺模型给玩家盾牌。最后,控制器通过 JSON 通知应用程序购买了盾牌。

这是一个可接受的结构,还是每个控制器都应该只有一个模型?如果每个控制器应该只有一个模型,我该如何避免复制粘贴处理这些点的代码?我这样做完全错了吗?

请不要纠结于数据库结构或类似的东西。这不是一个真实的例子。我只是想弄清楚如何组织

【问题讨论】:

  • 你绝对是在正确的轨道上。保持逻辑段分开并保持 DRY。
  • 您完美地创建了模型(每个用于单独的任务),您可以在一个控制器中使用多个模型,也可以在多个控制器中使用一个模型。

标签: php codeigniter model-view-controller


【解决方案1】:

这真的和你想的一样简单。 Codeigniter 中的模型只是应该将 db 结果传递给控制器​​或自定义类,然后再传递给控制器​​。

您可以在控制器中加载任意数量的模型 - 这根本不是问题。就我个人而言,我尝试将我的模型 > 数据库表保持在一对一的关系中。如果我需要处理模型中的数据,我通常会添加一个库(自定义类)来处理该部分。

这样我的控制器就会保持干净。

【讨论】:

    【解决方案2】:

    我会给你一些建议:

    1. 为了节省您的时间,请使用此 API RESTSERVER 来实现与您一样的功能 解释一下。

    2. 对于通用功能,创建一个库,然后自动加载它,当您需要它时,只需在您想要的地方调用它。您可以在视图、控制器、模型的任何地方调用一个库。

    例如,只是一个想法,图书馆看起来像。

    <?php if (!defined('BASEPATH')) {
        exit('No direct script access allowed');
    }
    
        class Menu {
    
            public $ci;
            public $table="tblmenu";
            public $full_record = array();
            function __construct() {
                $this->ci = &get_instance();
                $this->company_id = $this->ci->session->userdata('company_id');
            }
            public function get_menu($comp_id = NULL) {
                $comp_id = ($comp_id) ? $comp_id : $this->company_id;
                $this->ci->db->select()->from($this->table)->where('company_id', $comp_id);
                $this->ci->db->where('visible', 1);
                $this->ci->db->order_by('id', 'ASC');
                $this->full_record = $this->ci->db->get()->result_array();
                return $this->full_record;
            }
        }
    

    然后当你需要它时:

    $this->load->library('menu');//or auto load it .
    $this->menu->get_menu();
    

    【讨论】:

    • 我有一个强烈的印象,CI 的约定是只从模型中访问数据库。这种印象不准确吗?
    • 不!没必要,你可以利用库和辅助函数一起完成工作。
    猜你喜欢
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多