2011-11-10 11 views
0

カテゴリをループし、それぞれのカテゴリ内でトップのストアを実行する必要があります。これは比較的新しいMVCです。これをMVCに合わせてどのように達成するかはわかりました原則。私はこのような何かを行う上で計画していた瞬間MVCパターンの配列をループする正しい方法

が、今、私はそれを見て私は、私がモデルであるべき感じるものの非常に多くを参照してください。

私のコントローラは、次のようになります。

public function category_list() { 

    foreach ($this->CategoryModel->getCategoryList() as $cat) {   

    $data['cat_title'] = $cat['category_title'];   
    $data['list']['stores'] = $this->StoresModel->getStoresByCategory($cat['category_id']); 
    $this->_Load->view('stores_by_category.tpl', $data); 

    } 

} 

これは、この作業を達成するうえで正しい方法ですか、または罪悪感を感じることですか?

感謝

答えて

1

良い:

コントローラを使用して、ビューで使用するデータを入力しています。 あなたは

が悪いなど、対ネイティブSQL)getCategoryListにモデルコール(作っている:

ループ内のテンプレートの呼び出しをラッピング。あなたは、あなたのやり方のようにgetCategoryList()の行を$ dataにローカライズする必要がありますが、$ data配列を使ってテンプレートを一度呼び出すと、テンプレートは$ dataを繰り返し処理します。

ポインター:

あなたのコントローラはできるだけ軽量でなければなりません、しかし、ここでいくつかの余地があります。どのカテゴリーを返すかを指示するビジネスロジックがある場合は、複数のコードポイントからロジックにアクセスするかどうかを判断する必要があります。このような場合は、ビジネスロジックを集中した場所(新しいクラス)に配置することをお勧めします。新しい場所はモデルデータを引き込み、ビジネスルールに従ってマッサージし、データを呼び出しコードに戻します。それが1回限りのビジネスロジックルールであれば、コントローラ内に置くことは安全です。

+0

コントローラとモデルの間のブリッジングクラスを選択すると言っていますか? –

+0

あなたはそれを持っています!ビューを介してデータを提示するときに考慮する必要のあるビジネスロジックがあり、複数のコードポイントからロジックにアクセスできるようにする場合。 ORM(doctrine/propel)を使用するいくつかのフル機能フレームワーク(symfony)は、実際にビジネスロジックを置くことができる 'テーブル'または 'ピア'クラスを持っています。 –

+0

これは私が行った解決策です。ありがとうございます。 –

1

あなたはその男を見てみたいことはありませんタンクエンジントーマスの外であなたは、トップハム・ハット卿を避けたいために正しいです。 :)

しかし、この特定のケースでは、私はあなたのコードがプレゼンテーションであると考える傾向があり、したがって、おそらくビューに配置するのが最適です。モデルがどのように使用されているかについては何も知らないことを忘れないでください。このため、私は個人的にはビュー変数に$this->CategoryModel->getCategoryList()を割り当て、ビューにforeachループを実装させることになります。

1

CategoryModelのインスタンスがカテゴリのリストを取得する必要がある理由がわかりません。モデルはのデータをデータベースに格納します。あなたがやろうとしていることは、モデルのリポジトリクラスに置く必要があります。リポジトリは、データベースからエントリを取得する処理を行います。だから、あなたは2つのクラス:CategoryModelCategoryRepositoryを持っているはずです。

StoresModelクラスも同様です。さらに、カテゴリの店舗にはCategoryModelのインスタンス($category->getStores()など)からアクセスできる必要があります。 storesプロパティは、ORMによって設定される必要があります。

また、コントローラにモデルを挿入しないでください(ただし、モデルをリポジトリのように使用しているため、これを行うと思います)。

2

「fat model」v.s「thin model」のような質問については、まだ多くの人々が議論しています。 あなたが私に尋ねるなら、あなたはあなた自身のコードを考慮して、あなたのコードをどこに置くか決めなければなりません。将来、あなたはあなたのコードを最大限に活用し、あなたのアプリケーションは容易に拡張可能である。 それはあなた次第です。あなたのコードを見せないようにしてください。それは非常に間違っています。

+0

MVCは単なるパターンであり、良い点です。 +1 – hakre

+1

脂肪モデルが好ましいと考えられるのは、再利用性を助けるためです。コントローラに相当量の機能が実装されていると、コントローラコードのチャンクをコピーしなくても、モデルを別のプロジェクトに移動したり、別のコントローラで使用したりすることはできません。もちろん、これが価値があるときとそうでないときの判断を呼びかけるものですが、大雑把に言えば、太いモデルの薄いコントローラーは、通常、従うのが良いアプローチです。 – GordonM

+0

私は同意しますが、私の練習では、私はクラスの中でそのコードを分離しています...私はすべてのロジック(モデル、ヘルパー、他のクラス)の間のブリッジのようなコントローラを使用したいのですが...それは私の方法です物事を好む、それは私のためにうまくいく。 – Antagonist

0

あなたのコードは正常に見えるが、あなたが本当に望むのモデルからONLYブリッジデータへのあなたのコントローラーをしたい場合は、foreachの()ループがモデルで行う必要があり、そしてあなたのコードのようなものでなければなりません:

/* controller side */ 
public function category_list() 
{ 
    $this->_Load->view('stores_by_category.tpl', $this->StoresModel->getFormattedCategoryList()); 
} 

/* model side */ 
public function getFormattedCategoryList() 
{ 
    $data = Array(); 

    foreach ($this->getCategoryList() as $cat) 
    {   
     $data['cat_title'] = $cat['category_title']; 
     $data['list']['stores'] = $this->getStoresByCategory($cat['category_id']); 
    } 

    return $data; 
} 
+0

MVCが主張するモデルのモジュール性/分離性を維持しながら、モデルにローカルに留まるので、これは私にとって賢明な示唆のようです。 –

関連する問題