0

CodeIgniterMVCの原理について「簡単な」質問があります。CI(モデル)のマニュアルを見ると、たとえば次のようになっています。

function insert_entry()
{
    $this->title   = $_POST['title']; // please read the below note
    $this->content = $_POST['content'];
    $this->date    = time();
    $this->db->insert('entries', $this);
}

そうですね、この方法でデータを入力するのは悪いことです:)だけでなく、「$ this-> input-> post()」を使用すると…私にとっては見栄えが良くありません。モデルの関数を使用する前に、コントローラーでデータを処理する方がよいのではないでしょうか。たぶん、モデルパーツはそう見えます:

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

そして、このようなコントローラーでは:

$this->load->model('Blog');
$data = array();
$data['title'] = $this->input->post('title');
$data['content'] = $this->input->post('content');
$this->Blog->insert_entry($data);

しかし、どこで検証などを実行しますか?…モデルまたはコントローラー?多分誰かが私が知りたいことを理解しています。たぶん、あなたはもう少し経験やリンクなどを持っています。ありがとう!

4

2 に答える 2

6

CodeIgniter を使用して適切な MVC または MVC にインスパイアされたデザイン パターンを実装しようとしている場合は、すでに失敗しています。CodeIgniter は、MVC および関連するパターンの考え方には従いません。実際には、Rails で使用されているパターンを複製するだけです(理由と方法を知りたい場合は、コメント セクションで詳しく説明できます)

それは言った...

コントローラーで が使用される理由$this->input->post()は、抽象化を提供し、コードを PHP のスーパーグローバルから分離するためです。「コントローラー」と呼ばれるものは、ユーザーのリクエストからデータを収集し、それをモデルレイヤーの構造に渡す必要があります。モデル層はフロン​​トエンドを完全に認識しない必要があります。<input/>請求書番号の名前を「innr」から「number」に変更しただけでは、請求書を作成するためのドメイン ビジネス ロジックは変わりません。

データの検証は、モデル レイヤーで行う必要があります。適切に行われると、検証用のコードはドメイン オブジェクトの一部になり、データ整合性チェックはストレージの抽象化 (たとえば、データ マッパー) によって処理されますが、CodeIgniter では通常、ドメインとストレージの両方のロジックをまとめて、「モデル」と呼びます。 "。もちろん、これはSRPに違反していますが、CI ユーザーは気にせず、そのような原則に気づいていません。したがって、基本的に、CI 用に作成する場合、検証は「モデル」で行う必要があります。

主題全体についてもっと読みたい場合は、この投稿が関連しているかもしれません。

于 2012-09-28T00:30:55.777 に答える
0

こんにちはあなたは次のようなものを持っているでしょう

class new_controller extends CI_Controller {

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

    function insert_db_entry() {
        $this->load->model('Blog');
        $data = array();
        if($this->input->post("submit")) {

            $this->load->library("form_validation");

            //create the form validation rules

            if($this->form_validation->run() === TRUE) {

                $data['title'] = $this->input->post('title');
                $data['content'] = $this->input->post('content');
                $this->Blog->insert_entry($data);
            }
            else {
                $errors = validation_errors();
            }
        }
    }

}

フォーム送信が検出されたときに、フォーム検証ライブラリを使用して検証を処理します。

于 2012-09-27T21:00:53.787 に答える