在控制器或模型中处理的表单数据:哪个更好?

时间:2011-12-20 13:48:32

标签: codeigniter

我只是想知道哪一个更好,或者更推荐用于处理表单数据。

// Controller
// validation etc
$data = array('name'=>$this->input->post('name'), '... etc');
$this->user_model->insert($data);

// Model
function insert($data){
    $this->db->insert('users',$data);
}

// Controller
// validation etc
$this->user_model->insert();

// Model
function insert($data){
    $data = array('name'=>$this->input->post('name'), '... etc');
    $this->db->insert('users',$data);
}

我现在正在使用第二种方法。尽管插入没有问题,但我不得不说它不适合更新。我最终必须创建新方法来仅更新表的某些字段。我正在考虑改用第一种方法。我只是想知道是否有人可以帮助给出每种方法更清晰的利弊。

谢谢!

2 个答案:

答案 0 :(得分:3)

我同意模型和库应该进行大部分繁重处理,但是我认为模型和库方法应该尽可能可重用,并且Controller应该充当流量控制器,决定调用哪些模型和要发送给他们的数据。

所以在你的例子中,前者更有意义。以这种方式思考 - 除了通过表单帖子之外,您是否可能想要以其他方式添加用户?

另一种选择,如果你想要两全其美,请在模型中创建一个包装函数:

// Controller
// validation etc
$this->user_model->insert_from_post();

// Model
function insert_from_post(){
    $data = array('name'=>$this->input->post('name'), '... etc');
    $this->insert('users',$data);
}

function insert($data){
    $this->db->insert('users',$data);
}

当然在这个例子中似乎过分了。但是在更复杂的应用程序中,您可以快速重用具有已建立,可预测和测试结果的函数。

答案 1 :(得分:0)

将控制器降至最低。考虑使用控制器将数据传入和传出视图/模型。此外,我建议你做模型中的所有繁重的工作,html编码,日期解析等。你的视图应该做的唯一工作是吐出变量或循环它们

Codeigniter 2.1允许您将所有form_validation配置放入application / config / form_validation.php中的一个文件中

所以你的控制器真的需要做的就是说

if ($this->form_validation->run('auth/register')) {/** interact with your models or libraries (keep the  heavy stuff outside **/ )}else{//show form}

编辑:@catfish

将控制器保持在最低限度并不是说"不要在控制器中放任何东西"。如果你注意到上面我在控制器中包含了表单验证,但你可以从控制器中排除form_validation配置。

最小控制器看起来像这样。

class someclass extends CI_Controller
{
 //The form validation rules go inside the application/config/form_validation.php
 //and is called automatically once the class/method is init

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

 public function form()
 {
    $this->load->view('templates/public', array('content'=>'form_view.php'));
 }

 public function validate()
 {
      if($this->form_validation->run('someclass/validate'))// optionally pass the config key
      {
          if(Model::method($this->input->post()))
          {
              //do something positive
          }else
          {
             $this->session->set_flashdata('error', $this->lang->line('some_error'));
             redirect('/');
          }
      }else
      {
         $this->form();//show form again
      }
 }

 public function work_with_model()
 {
     $this->load->view('_index', array(
        'model_data'=> model::method()// do all looping, html encoding, time/date parsing etc and only send back a string or an array/object ready for output
     ));
 }

} 

应用/配置/ form_validation.php

$config = array('someclass/validate'=>array(
     array('field'=>'Field', 'label'=>'Label', 'rules'=>'trim|required|xss_clean|serialize')
));

我试图制作的观点只是使用你的控制器作为传递,只需要很少的逻辑