0

我有一个关于 CodeIgniter MVC 原理的“简单”问题。如果我查看 CI (Models) 的手册,我会看到例如:

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

但是我在哪里运行验证等......模型或控制器?也许有人明白我想知道什么。也许你有更多的经验、链接或其他什么。谢谢!

4

2 回答 2

6

如果您尝试使用 CodeIgniter 实现正确的 MVC 或受 MVC 启发的设计模式,那么您已经失败了。CodeIgniter 不遵循 MVC 和相关模式的思想。它实际上只是克隆了 Rails 中使用的模式(如果您想知道原因和方式,我可以在评论部分详细说明)

那就是说...

在控制器中使用的原因$this->input->post()是提供一些抽象并将您的代码与 PHP 的超全局变量分开。您所谓的“控制器”应该从用户的请求中收集数据并将其传递给模型层的结构。模型层应该完全不知道前端。创建发票的域业务逻辑不会因为您将<input/>发票编号从“innr”重命名为“number”而改变。

数据验证应该发生在模型层。如果处理得当,验证代码是域对象的一部分,数据完整性检查将由存储抽象(例如,数据映射器)处理,但在 CodeIgniter 中,人们通常将域和存储逻辑混为一谈,并称之为:“模型”。当然这违反了SRP,但 CI 用户并不关心,甚至不知道这些原则。所以基本上,在为 CI 编写时,验证应该发生在“模型”中。

如果您想阅读有关整个主题的更多信息,您可能会发现这篇文章很相关。

于 2012-09-28T00:30:55.777 回答
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();
            }
        }
    }

}

当检测到表单提交时,您使用表单验证库来处理验证。

于 2012-09-27T21:00:53.787 回答