2011-12-20 57 views
3

我只是想知道哪一個更好,或者更推薦處理表單數據。在控制器或模型中處理表單數據:哪個更好?

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

我用此刻的第二種方法。儘管插入沒有問題,但我不得不說它不適合更新。我最終不得不創建新的方法來只更新表中的某些字段。我正在考慮改用第一種方法。我只是想知道是否有人可以幫助給出每種方法更明確的優點和缺點。

謝謝!

回答

3

我同意模型和圖書館應該完成大部分重處理工作,但是我相信模型和圖書館方法應儘可能重複使用,並且控制員應該擔任交通主任,決定調用哪些模型以及向他們發送什麼數據。

所以在你的例子中,前者更有意義。以這種方式考慮一下 - 您可能想通過其他方式添加用戶,而不是通過表單帖子來添加用戶嗎?在這個例子中

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

當然它似乎過高:

另一種選擇,如果你想兩全其美,在模型中創建一個包裝函數。但是在更復雜的應用程序中,您可以通過重用已建立,可預測和測試結果的函數而快速受益。

+0

是的,我同意你的答案。我認爲最好有2個插入或更新函數,一個是從一個表單文章進行處理,另一個是插入/更新只有必要的內容。插入/更新所有數據只會被表單使用,而像set用戶的狀態/活動/ activation_date可能需要靈活的更新功能。你怎麼看? – Henson 2011-12-21 07:06:23

+0

聽起來沒錯。在某些情況下,我構建了複雜的模型,並使用了活動記錄類的方法鏈接語法,這使得控制器代碼看起來非常好:'$ this-> User_model-> set_username('Henson') - > set_email('whatever @ whoever.tdm') - >插入();' – Thor 2011-12-23 01:18:53

0

保持您的控制器到最低限度。考慮使用您的控制器將數據傳入和傳出您的視圖/模型。此外,我會建議你在你的模型,HTML編碼,日期解析等所有繁重的工作。你的觀點應該做的唯一工作是吐出變量或循環通過他們

Codeigniter 2.1允許你把所有的form_validation配置進入裏面的應用程序一個文件/配置/ 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 
    )); 
} 

} 

的application/config/form_validation.php

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

的時候,我試圖讓只用你的控制器之間的傳球,用最少的邏輯

+0

但更新表的某些字段呢?比方說,用戶表有姓名,年齡,地址,電話,狀態。常用的更新表單將包含姓名,年齡,地址,電話字段,所以常用的更新功能將更新這些字段中的4個。然後對於狀態,我可能有一個函數set_status($ user_id),它基本上只更新user_id = $ user_id的狀態。這就是我一直在做的事情,所以我想知道這是否是件好事。但是這會使控制器非常容易閱讀。 – Henson 2011-12-20 14:36:46

+0

所有你需要做的是把你的$ this-> input-> post()數組,通過修改值來修改它,然後將其傳遞給你的模型/庫。如果你所需要做的只是修改其中一個鍵,比如你想序列化它,你應該可以在你的form_validation配置標記中做到這一點。即:'rules'=>'trim | required | xss_clean | serialize' – Philip 2011-12-20 15:17:31

+1

@philip我完全不同意將控制器降到最低。如果是這樣的話,那麼擁有它們有什麼意義呢?恕我直言,該模型僅用於數據訪問,而控制器處理form_validation等。參見http://codeigniter.com/user_guide/overview/mvc.html – Catfish 2011-12-20 19:52:57

相關問題