CodeIgniter MVC:每个控制器有多个模型


CodeIgniter MVC: multiple models per controller?

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

这是一个即兴的例子,而不是一个实际的例子,但希望它能帮助我理解:假设我正在制作一个具有迷你游戏和虚拟商店的应用程序。玩家可以通过玩迷你游戏获得积分。他们可以用这些积分在商店里购买商品。他们还可以在商店里出售商品来赚取积分。应用程序应记录每个积分事务。

在这种情况下,我的想法是我会有一个:

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

  • ShopController-使用ShopModel和PointsModel

  • MiniGameController-利用MiniGameModel和PointsModel

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

用户告诉应用程序他们想购买盾牌。应用程序通知车间管理员。商店控制器从商店模型中查询价格,然后告诉积分模型减去积分,然后告诉商店模型给玩家盾牌。最后,控制器通过JSON通知应用程序屏蔽已购买。

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

请不要被数据库结构或类似的东西所困扰。这不是一个真实的例子。我只是想知道如何组织

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

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

这样我的控制器就能保持清洁。

我会给你一些建议:

  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();