我有一个关于CodeIgniter MVC原理的“简单”问题。 如果我查看CI(模型)中的手册,我会看到例如:
function insert_entry()
{
$this->title = $_POST['title']; // please read the below note
$this->content = $_POST['content'];
$this->date = time();
$this->db->insert('entries', $this);
}
好吧,好吧 - 以这种方式输入数据很糟糕我知道:)但是如果我们用“$ this-> input-> post()”...对我来说它看起来并不好。在使用模型中的函数之前处理控制器中的数据不是更好吗?也许模型部分看起来如此:
function insert_entry($data)
{
$this->db->insert('entries', $data);
}
在像这样的控制器中:
$this->load->model('Blog');
$data = array();
$data['title'] = $this->input->post('title');
$data['content'] = $this->input->post('content');
$this->Blog->insert_entry($data);
但我在哪里运行验证等......模型或控制器? 也许有人明白我想知道什么。也许你有更多的经验,链接或其他什么。谢谢!
答案 0 :(得分:6)
如果您尝试使用CodeIgniter实现适当的MVC或MVC启发的设计模式,那么您已经失败了。 CodeIgniter不遵循MVC和相关模式的想法。它实际上只是克隆了Rails 中使用的模式(我可以在评论部分详细说明,如果你想知道原因和方法)。
那说......
在控制器中使用$this->input->post()
的原因是提供一些抽象并将代码与PHP的超全局分开。你所谓的“控制器”应该从用户的请求中收集数据并将其传递给模型层的结构。模型层应该完全没有意识到前端。用于创建发票的域业务逻辑不会因为您将发票号码的<input/>
从“innr”重命名为“number”而发生更改。
数据验证应该在模型层中进行。正确完成后,验证代码是domain objects的一部分,数据完整性检查将由存储抽象处理(例如,data mapper),但在CodeIgniter中,人们通常将域和存储逻辑混为一谈并称之为:“模特”。当然,这违反了SRP,但CI用户并不关心,甚至没有意识到这些原则。所以基本上,在为CI编写时,验证应该在“模型”中进行。
如果您想了解有关整个主题的更多信息,可能会发现this post相关。
答案 1 :(得分:0)
嗨,你会有像
这样的东西class new_controller extends CI_Controller {
function __construct()
{
parent::__construct();
}
function insert_db_entry() {
$this->load->model('Blog');
$data = array();
if($this->input->post("submit")) {
$this->load->library("form_validation");
//create the form validation rules
if($this->form_validation->run() === TRUE) {
$data['title'] = $this->input->post('title');
$data['content'] = $this->input->post('content');
$this->Blog->insert_entry($data);
}
else {
$errors = validation_errors();
}
}
}
}
您在检测到表单提交时使用表单验证库来处理验证。