【问题标题】:CodeIgniter and the Model-View-Controller – your experience / your meaning?CodeIgniter 和模型-视图-控制器——你的经验/你的意思?
【发布时间】:2012-09-19 17:02:49
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    也就是说……

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

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

    如果您想了解有关整个主题的更多信息,您可能会发现 this post 相关。

    【讨论】:

    • 这就是我的意思,谢谢...“我可以在 cmets 部分详细说明,如果你想知道为什么以及如何”请告诉我更多;)
    • Rails 框架是在 05 年创建的,它的意思是作为原型框架(用于快速构建一次性代码)......在这方面它非常好。但它从未打算用于大型生产阶段的应用程序。它没有实现完整的 MVC,而是选择了 ActiveRecord 实例列表作为“模型”,并将视图和控制器合并为单个实体,称为“控制器”。这使它没有视图,因此他们决定将模板称为“视图”。这是原型设计非常好的解决方案。太好了,以至于其他所有框架都开始复制它并调用“MVC”。
    • @kailange ,另外,作为使用 ActiveRecords 的副作用,一些域业务逻辑倾向于强制在“控制器”中。这是因为 AR 直接与数据库中的表相关联,您最终会遇到这样的情况,即您无处放置与两个不相关的 AR 实例交互的逻辑。这会导致控制器增长。代码变得难以维护和混乱。诀窍是 - 它从未打算维护。
    • 好吧,我稍后再看看 - 也许你有一些链接可以阅读?
    【解决方案2】:

    嗨,你会有类似的东西

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

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

    【讨论】:

    • codeigniter.com/user_guide/libraries/form_validation.html 这是 CI 说明手册,在使用此框架时您需要了解的大部分内容都使用它
    • 首先谢谢,但这不是我的意思;9 我想知道 wahat 是用 mvc 编写代码的最佳“方式”......在你的代码中“$this->博客->insert_entry($data);"运行模型,但下一个问题是在哪里检查插入(在本例中)是否成功?! ...
    • 好的,我一直用于处理数据库查询和返回数据的模型。我用于大多数事情的控制器,包括表单提交和验证。如果您希望通过多个不同的控制器访问功能,帮助程序会非常有用。
    • 我已经编辑了您的帖子,所以您认为这种方式会“好”吗?也可以在这里找到:pastebin.com/wVgGUFLw
    • 看起来不错,您只需要定义一些规则以使 form_validation 正常工作,就可以了。 $this->form_validation->set_rules('title', 'Title', 'required|min_length[5]|max_length[12]');您可以在加载 form_validation 库和 if 之间插入它。您为要提交的每个表单元素创建一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2017-02-28
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多