3

在开始学习 Codeigniter 并因此更好地处理 MVC 之后,我开始想知道一些事情。

假设有一个模型可以控制存储在数据库中的用户。通过在 Control 中验证的表单完成简单的注册,然后将数据传递到模型以存储在数据库中。现在,将发布的数据和设置传递给要存储的数据库的数组的过程在模型中组装,如下所示:

function add_user() {
        $new_user_data = array(
            'etunimi' => $this->input->post('etunimi'),
            'sukunimi' => $this->input->post('sukunimi'),
            'osoite' => $this->input->post('osoite'),
            'postinro' => $this->input->post('postinro'),
            'toimipaikka' => $this->input->post('toimipaikka'),
            'puhelin' => $this->input->post('puhelin'),
            'email' => $this->input->post('email'),
            'tunnus' => $this->input->post('tunnus'),
            'salasana' => $this->input->post('salasana')
        );

        $insert = $this->db->insert('kayttajat', $new_user_data);

        return $insert;
    }

我正在考虑的是将数据的组装转移到控制器中,从而使模型更加独立和可重用。因此,最终数据将作为方法参数传递:

function add_user ($new_user_data) {

        $insert = $this->db->insert('kayttajat', $new_user_data);

        return $insert;
    }

据我了解,这将在层之间进行更多区分,因为模型除了检索和传递最终信息之外什么都不做,证明和组装的责任在控制器上,而视图只是将其全部打印出来并提供 UI。

我想要一些更有经验的意见,关于哪个概念更类似于 MVC 原则并且更有意义。

4

5 回答 5

1

您的第二种方法创建了一个相当无意义的模型函数。你可以通过调用来达到同样的效果$this->db->insert()

第一种情况“好”的原因是因为您只会发送给定的列。例如,如果您草率,并将$this->input->post()作为参数发送给您的函数,那么您在额外的帖子字段中出现 mysel 错误的风险更大。

我的方法与此类似:

function add_user() {

    $arr = array('etunimi', 'sukunimi', 'osoite', 'postinro', 'toimipaikka', 'puhelin', 'email', 'tunnus', 'salasana');

    $new_user_data = array();
    foreach($arr as $h)
        $new_user_data[$h] = $this->input->post($h);

    $insert = $this->db->insert('kayttajat', $new_user_data);

    return $insert;

}

如果您希望传递数据,至少要确保只使用给定的字段:

function add_user($data) {

    $arr = array('etunimi', 'sukunimi', 'osoite', 'postinro', 'toimipaikka', 'puhelin', 'email', 'tunnus', 'salasana');

    $new_user_data = array();
    foreach($arr as $h)
        if (isset($data[$h]))
            $new_user_data[$h] = $data[$h];

    $insert = $this->db->insert('kayttajat', $new_user_data);

    return $insert;

}
于 2012-07-27T12:07:58.717 回答
1

您可以在控制器中进行验证并将数据发送到模型:

控制器:

if ($this->form_validation->run()) {
    $this->my_model->add_user($this->input->post());
}

模型:

function add_user($input) {
    $this->db->insert('kayttajat', $input);
}
于 2012-07-27T12:02:46.823 回答
0

我对 CI 有点经验,我可以告诉你,你的逻辑很好。您可以使用控制器中的插入值设置数组,以使模型更具可重用性。事实上,如果你想要一个更通用的模型,你可以使用以下内容:

function general_insert($table,$data){
   return $this->db->insert($table,$data);
}

因此,您只需传递表的名称和要插入的数据。

于 2012-07-28T05:51:24.613 回答
0

咆哮
这就是为什么使用 CodeIgniter 作为做 MVC 的例子是一个可怕的想法。

在正确的 MVC 中,模型是一个层,它由多个不同的类组成,每个类处理几个职责中的一个。模型层中不应有任何类包含或扩展某些名称中包含“模型”一词的类。这是第一个迹象,表明你做错了。

究竟做错了什么?

该类CI_Model本身不包含任何内容。你不能说它是包含领域业务逻辑的结构,因为里面什么都没有。但是文档敦促您使用 ActiveRecord 模式。这是一个问题,因为模式本身将存储与业务规则结合在一起。

由于某种原因,它被称为“模型”。

你得到一组类(出于公关原因,它们被称为“模型”)。每个类都专门处理一个表的存储和逻辑。没有逻辑的地方,即基于在来自多个表的数据之间进行交互。

为什么这有关系?

这种架构缺陷导致部分域业务逻辑(如验证)泄漏到控制器中。您最终会创建结构,其中,对于要交互的实体,“模型”中没有位置。

如何让它变得不那么糟糕?

停止尝试将您的“模型”直接映射到表。相反,您应该尝试转换类,这些类扩展CI_Model为服务之类的东西,为控制器提供域业务逻辑的高级接口。这样的服务级别结构可以包含实体之间的交互。

然后,这些服务可以使用域对象(其中包含特定实体的业务逻辑并可以验证自身)和数据映射器之类的东西来轻松存储和检索所述实体的信息。

于 2012-07-28T20:36:16.007 回答
0

另外的选择...

控制器

public function validate()
{
    //apply the rules
    $this->form_validation->set_rules('email', 'Email', 'required');

    if ($this->form_validation->run() == FALSE)
    {
        $this->load->view('form_incompleted');
    }
    else
    {

        $email = $this->input->post('email');

        //create the model and store it
        $user = new User($email);
        $user->add_user();

        $this->load->view('form_completed');
    }
}

模型

class User extends CI_Model {

    var $email = '';

    function __construct()
    {
        parent::__construct();
    }

    function __construct($email)
    {
        parent::__construct();
        $this->email = $email;
    }

    /**
     * Add the current user
     */
    function add_user()
    {
        $this->db->insert('kayttajat', $this);
    }

}

我只使用了email属性,但是您可以毫无问题地添加所有属性

于 2012-07-27T12:14:49.220 回答