Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Codeigniter 在控制器或模型中处理表单数据:哪个更好?_Codeigniter - Fatal编程技术网

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

Codeigniter 在控制器或模型中处理表单数据:哪个更好?,codeigniter,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
$data = array('name'=>$this->input->post('name'), '... etc');
$this->user_model->insert($data);

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

我现在正在使用第二种方法。尽管插入没有问题,但我不得不说它不太适合更新。我最终不得不创建新方法来只更新表的某些字段。我正在考虑改用第一种方法。我只是想知道是否有人能帮助给出每种方法的更明确的优缺点


谢谢

将控制器控制在最低限度。考虑使用控制器来向视图和模型传递数据。此外,我还建议您在模型中完成所有繁重的工作,如html编码、日期解析等。视图应该做的唯一工作是吐出变量或循环遍历变量

Codeigniter 2.1允许您将所有表单验证配置放在application/config/form\u validation.php内的一个文件中

$config = array('someclass/validate'=>array(
     array('field'=>'Field', 'label'=>'Label', 'rules'=>'trim|required|xss_clean|serialize')
));
所以你的控制器真正需要做的就是说

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

将控制器保持在最小值与说“不要在控制器中放入任何东西”不同。如果您注意到上面我在控制器中包含了表单验证,但是您可以从控制器中排除表单验证配置

最小控制器看起来是这样的

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

} 
application/config/form_validation.php

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

我想说的一点是,只使用控制器作为中间人,使用最少的逻辑

我同意模型和库应该做大部分繁重的处理,但是我认为模型和库方法应该尽可能重复使用,控制器应该充当交通指挥器,决定调用哪些模型以及向它们发送哪些数据

所以在你的例子中,前者更有意义。这样考虑一下——除了通过表单帖子之外,您是否可能希望以其他方式添加用户

另一个选项是,如果您希望两者兼得,请在模型中创建包装器函数:

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

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

但是更新表的某些字段又如何呢?假设users表包含姓名、年龄、地址、电话、状态。一个通用的更新表单将包含姓名、年龄、地址、电话字段,因此一个通用的更新函数将更新其中的4个字段。然后对于状态,我可能有一个函数set_status($user_id),它基本上只更新状态,其中user_id=$user_id。这就是我一直在做的,所以我想知道这是不是一件好事。但这使得控制器非常易于阅读。您只需使用$this->input->post()数组,通过使用修改后的值构建新数组,根据需要对其进行修改,然后将其传递给您的模型/库。如果您需要做的只是修改其中一个键,比如说您想要序列化它,那么您应该能够在form_validation config标记中这样做。ie:‘规则’=>‘修剪|必需| xss |清洁|序列化’@philip我完全不同意将控制器控制在最低限度。如果是这样的话,那么拥有它们又有什么意义呢?IMHO,该模型仅用于数据访问,而控制器处理表单验证等。请参阅@Philip我认为在model::method($arr)中添加任何内容(最有可能是数组)实际上更像第一个方法:),我猜catfish说的也是真的。控制器应该完成所有繁重的任务,比如准备要传递给模型或视图的数据。表单验证实际上也属于控制器的范围,你不同意吗?将它放入配置中基本上消除了在控制器中调用它的必要性,但除此之外,我们必须在控制器中进行调用。我想从现在开始我会坚持第一种方法,除非每种方法都有其他的优点和缺点是的,我同意你的答案。我认为最好有两个用于插入或更新的函数,一个是处理表单帖子,另一个是只插入/更新必要的内容。插入/更新所有数据仅由表单使用,而对于设置用户状态/活动/激活日期等事项,可能需要灵活的更新功能。你觉得呢?听起来不错。在某些情况下,我构建了复杂的模型,并在活动记录类中使用了方法链接语法,这使得控制器代码看起来非常漂亮:
$this->User\u model->set\u username('Henson')->set\u email('whatever@whoever.tdm')->insert()