CodeIgniter和模型 - 视图 - 控制器 - 您的经验/您的意思?

时间:2012-09-27 20:17:04

标签: oop model-view-controller codeigniter user-experience

我有一个关于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);

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

2 个答案:

答案 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();
            }
        }
    }

}

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