我被推进了一个现有的CodeIgniter项目,并且正在熟悉他们MVC方法的适当约定。有一件事我一直在纠结,那就是把模型和控制器联系起来。CI文档几乎没有对此提供任何指导,我不确定正确的方法是什么。我们的项目是一个由外部应用程序调用的API,所以我不关心视图,只关心模型和控制器。
这是一个即兴的例子,而不是一个实际的例子,但希望它能帮助我理解:假设我正在制作一个具有迷你游戏和虚拟商店的应用程序。玩家可以通过玩迷你游戏获得积分。他们可以用这些积分在商店里购买商品。他们还可以在商店里出售商品来赚取积分。应用程序应记录每个积分事务。
在这种情况下,我的想法是我会有一个:
- ShopModel-与数据库交互以加载产品数据并保存用户购买的商品
- MiniGameModel-与数据库交互以加载有关迷你游戏的数据并保存分数
-
积分模型-与数据库交互,将积分转入或转出玩家的账户(并在"日志"表中写入相应的日志条目)
-
ShopController-使用ShopModel和PointsModel
- MiniGameController-利用MiniGameModel和PointsModel
例如,用户告诉应用程序他们想在商店中搜索"武器"。该应用程序向控制器请求武器。商店控制器建立查询,商店模型执行查询并返回记录。控制器将记录格式化为JSON,并将其发送回应用程序。
用户告诉应用程序他们想购买盾牌。应用程序通知车间管理员。商店控制器从商店模型中查询价格,然后告诉积分模型减去积分,然后告诉商店模型给玩家盾牌。最后,控制器通过JSON通知应用程序屏蔽已购买。
这是一个可接受的结构,还是每个控制器都应该只有一个模型?如果每个控制器只有一个模型,如何避免复制粘贴处理点的代码?我这样做完全错了吗?
请不要被数据库结构或类似的东西所困扰。这不是一个真实的例子。我只是想知道如何组织类。
这真的和你想的一样简单。Codeigniter中的模型只需要将db结果传递给控制器或自定义类,然后再传递给控制器。
你可以在控制器中加载任意多个模型——这根本不是问题。就我个人而言,我试图将我的模型>db表保持在一对一的关系中。如果我要处理模型中的数据,我通常会添加一个库(自定义类)来处理该部分。
这样我的控制器就能保持清洁。
我会给你一些建议:
-
为了节省您的时间,请将此API RESTSERVER用于类似您的功能解释
-
对于常见功能,创建一个库,然后自动加载它,当你需要它时,只需在你想要的地方调用它。你可以在视图、控制器和模型中的任何地方调用库。
例如,只是一个想法,图书馆看起来像。
<?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();