2011-07-25 13 views
1

私は現在CodeIgniterでアプリケーションを作成していますが、私はどのようにモデルを扱うべきかと思っていました。など 図書館、図書館に話し、ディスプレイ関連の事、フォーム検証、リダイレクトします:力仕事を行い、モデルに話し、エラーが発生しCodeIgniter - MVCのアプローチの質問

再生回数::ディスプレイ コントローラ方法私はそれが現時点で設定していますメッセージ、ログなど モデル:DBに話

(私は現在、ほとんどの事のためのActive Recordを使用しています)

は私が例にまっすぐに行こう:

私は認証ライブラリーを持っており、内部私はクエリの領域が多少似ているが、 WHERE句の値によってのみ変化します。

例:

get_by_id($id); 
get_by_password_hash($email); 
get_by_email($email); 

私はこれらの重複したモデル関数の束を持っているべきか、私はちょうど私がWHERE句を渡し、その他もろもろのライブラリを介して1つの単純な機能を持っている必要がありますか?

例:

$where = array('id' => $id); 
get($where); 

あなたが何かを明確にするために、私が欲しい場合は私に知らせてください。 ありがとうございます。

答えて

1

あなたが与えられたモデルのためのget_by_*方法の多くを持っている場合、それはTaylorOtwellが示唆したように、魔法のメソッドを使用しても意味がありません。実際には、__callメソッドと__get__setは、他のフレームワークで頻繁に使用され、あなたが話していることを正確に行うのを容易にします。マッピング中は、コントローラ上の__call MagicメソッドでCIがうまく動作しないことを覚えておいてください(ただし、モデルには影響しません)。私はCIにCMV見

基本的な方法:

  • ライブラリ - この「レンダリングロジック」の大部分はどこに起きているが、一般的に制御/モデル/ビュー不可知論者でなければなりません。ほぼ完全に無国籍(私の好み)。
  • ヘルパー - ユーティリティ関数、主にビュー関連(他のすべてのライブラリー(もっと直交、矢田、矢田、矢田)をオフ本当に良いです)
  • コントローラ - ロードライブラリ/モデルや手法
  • を呼び出しますModel - DBラッピングレイヤー。ほぼ完全にステートフル(私の好み)。ない限りDBクエリほぼ独占的モデルに追いやられるべき - 句がどこ渡すことにしたよう

    class Users 
    { 
        function display($id) 
        { 
         $this->load->library('myformatlib'); 
         $this->load->model('mymodel'); 
         $data = $this->mymodel->get_user($id); 
         $formatted = $this->myformatlib->addColors($data); 
         $this->mymodel->incrementViews($id); 
         $this->load->view('full_user', $formatted); 
        } 
    } 
    

    : -

  • ビュー表示データ

よく、コントローラは次のようなことを行います他のオプションはありません。そうすることはあまりにも面倒です(しかし、私があなたがそれをリファクタリングできないのだろうかと思います)。

1

あなたは、where句の任意の単純な処理するために、あなたのモデルにPHPの__call Magic Methodを使用することができます。私は数ヶ月前に同じ疑問を持っていたので、私はあなたから来ている場所を正確に知っている

public function __call($method, $parameters) 
{ 
    if (strpos($method, 'get_by_') === 0) 
    { 
     $this->get(array(substr($method, 7), $parameters[0])); 
    } 
} 
1

を。

私はちょうどライブラリとしてそれを使用https://bitbucket.org/philsturgeon/codeigniter-base-model/src/93a643d0d46f/MY_Model.php

を使用しています。

// user_m.php 
<?php (defined('BASEPATH')) OR exit('No direct script access allowed'); 
class User_m extends MY_Model 
{} 

上記のモデルは、基本的なCRUD以外のカスタム関数を持つことができます。

そのあなたが必要とするすべての基本的なCRUD操作を得た

$this->load->model('user_m'); 
    $this->data['user'] = $this->user_m->get($user_id); 

または

$this->load->model('user_m'); 
    $this->data['user'] = $this->user_m->get_by(array('something_id' => $something)); 

としてあなたは、コントローラのコードを実行します。ちょうどコードを読んでください。そのコードもかなりよく書かれています。