2011-12-20 6 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つの機能を持っている方が良いと思います、1つはフォーム投稿から処理し、もう1つは必要なものだけを挿入/更新することです。すべてのデータの挿入/更新はフォームでのみ使用されますが、set userのstatus/active/activation_dateなどの場合は、柔軟な更新機能が必要な場合があります。どう思いますか? – Henson

+0

右の音。いくつかのケースで私は複雑なモデルを構築し、アクティブなレコードクラスのようなメソッド連鎖構文を使用しました。これはコントローラコードを本当にいいものにします: '$ this-> User_model-> set_username( 'Henson') - > set_email( 'whatever @ whoever.tdm ') - > insert(); ' – Thor

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

} 

アプリケーション/設定/ form_validation.php

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

+0

しかし、テーブルの一部のフィールドを更新するのはどうですか?ユーザーテーブルに名前、年齢、住所、電話番号、ステータスがあるとします。一般的な更新フォームは、名前、年齢、住所、電話番号フィールドを持つため、共通の更新機能ではこれらのフィールドのうち4つが更新されます。状態については、基本的にはuser_id = $ user_idの状態のみを更新する関数set_status($ user_id)があります。それは私がとにかく行ってきたことなので、それは良いことかどうか分かりません。しかし、これはコントローラーを非常に読みやすくします。 – Henson

+0

$ this-> input-> post()配列を取って、必要に応じて変更した値で新しい配列を作成し、モデル/ライブラリに渡してください。もしあなたがする必要があるのは、キーの1つを変更すること、つまりシリアル化したいと思うなら、form_validation設定マークアップでこれを行うことができるはずです。つまり: 'rules' => 'trim | required | xss_clean | serialize' – Philip

+1

@philipコントローラを最小限に保つことに全く反対します。それが事実だったら、それを持つのは何ですか? IMHO、モデルはデータアクセス専用ですが、コントローラがform_validationなどを処理しています。http://codeigniter.com/user_guide/overview/mvc.htmlを参照してください。 – Catfish

関連する問題