3

ordersデータベーステーブルを備えた単純な Web アプリケーションがありproducts、CakePHP で作り直しています。他にもありますが、簡単にするために、ここではこの 2 つだけを使用します。Web アプリで、商品検索、注文検索、注文関連の仕事ができるようにしたいのですが、この Web アプリを作成するために使用するコンポーネントの設定と選択に苦労しています。私の問題の例として、次のページがあります。以下のレイアウトをご覧ください。

|------------------------------|   
|            My App            | 
|------------------------------|
|Search <--| search order      |
|Orders    | search product    |
|etc.      |                   |
|          |                   |
|          |                   |
|------------------------------|

図: 左のナビゲーション バーと本体が表示されています。矢印は現在のページを示しています。

  1. コントローラ: この検索ページでは、どのコントローラを使用する必要がありますか? 現在、静的ページのデフォルトを に設定PagesControllerしていますが、この検索ページは本当に を使用する必要がありますPagesControllerか? と はモデルとモデルを作成したときに作成されたものもありProductsControllerますが、完全に新しいコントローラーを使用する方が適切なようです。このようにして、URL は下にとどまり、あちこちに移動しません。これは適切な方法ですか?(URL を書き換えることができることは知っていますが、それは後で説明します)OrdersControllerProductOrderSearchControllermyapp/search/...

  2. モデルとアクション: 私はモデルProductOrderモデルを持っています。これらの各モデルには、それぞれの DB テーブルの検索ロジックがあります。上記のページ用に新しいコントローラーを作成した場合、そのコントローラーはこれらのモデルのアクションをそのまま使用できますよね? 私はコントローラーを読んでいますが、モデルの分離は完全に正常であり、実際には良いことです。最初は一緒だと思っていたのですが、CakePHP に慣れてくると逆に思えてきます。

  3. 私のアプローチ (1 と 2 から) が非効率的、間違っている、または不適切でない場合、使用するコントローラーと、コントローラーがモデルとそのア​​クションを使用する方法に関して、この特定のページを設定するための適切な構造を提案できますか?

4

3 に答える 3

1

TLDR:

本当の答えは-個人的な好みです。を作成するか、 andをSearchesController使用するかはどちらの方法でも大したことではありません(ただし、PagesControllerは使用しないでください)。ProductsControllerOrdersController

私の好みと推論

を作成しSearchesControllerます。これは、組織的な目的に最も適しています。すべての検索機能を同じコントローラーに配置し、すべての検索ビューを「Views / Searches /」フォルダーに配置し、関連するすべてのcssとjavascriptを/css/searchesまたは/js/searches/(私のように整理したい場合)に配置できます。 )。

また、検索モデル(Models/Search.php)を作成し、その中に次を追加します。 public $useTable = false; [詳細]テーブルを作成しないことを通知しsearchesます。

function orders()およびのようなSearchControllerの各アクション内で、[details]function products()を使用して、からこれらのモデルにアクセスできるようにしてから、検索を実行できます。$this->loadModel('Order'); SearchesController

「FatModels、Skinny Controllers」のマントラに固執するために、コントローラーコードを小さく保つことをお勧めします-次のようになります。

$opts = array('limit'=>5);
$orders = $this->Order->search($string, $opts);

次に、Orderモデル(この例による)で、ロジックの要点を実行します(以下は大まかなアイデアです)。

public function search($string = null, $opts = null) {
    $params = array();
    $params['limit'] = 10; //sets default
    if(!empty($opts['limit'])) $params['limit'] = $opts['limit'];
    //... build options, contains, limits...etc
    return $this->find('all', $params);
}

すべてのコントローラーアクションをまとめておくと、すべての検索ページを変更するページごとの結果に単一の変数を設定する場合など、より簡単に抜本的な変更を行うことができます。他にもたくさんのアイデアがあると思いますが、結局のところ、同様のコードをまとめています。

于 2012-04-18T03:58:58.920 に答える
1

別の検索コントローラーを使用することをお勧めします。検索コントローラー内で、クラス レベルでこの行を追加するだけでvar $uses = array('Order', 'Product');、Order テーブルと Product テーブルにアクセスできます。

単に使用$this->Order->find()して$this->Product->find()

于 2012-04-17T23:01:39.230 に答える
0
  1. そのために新しいコントローラーを作成する必要はありません。同じコントローラー (Products と言う) と、そのコントローラーの Search というアクションを使用できます。したがって、リンクは /Products/Search を指します
  2. 新しいコントローラーを作成しても、対応するコントローラーをインポートすることで他のモデルにアクセスできます
  3. Cake の通常の動作に固執することをお勧めします。アプリケーションにあるモデルごとにコントローラーを作成します。通常、各モデルは、システムに変換するシナリオのエンティティ (物理的または論理的) を表すクラスである必要があり、これらのメソッドごとにコントローラーがあります。
于 2012-04-17T22:45:19.683 に答える