0

MVCアプローチを使用してPHPでWebアプリケーションを開発しています(フレームワーク、純粋なPHPを使用していません)。MVC でよくあることですが、すべての要求はフロント コントローラーに到着し、フロント コントローラーはそれを対応するコントローラーにルーティングし、要求されたアクションを実行します。URL 構造は次のようになります。

www.site.com/controller/action

さまざまなカテゴリの製品を扱う e コマース サイトを構築しているとします。可能な URL は次のとおりです。

www.site.com/sofas/overview
www.site.com/video-games/overview

最初の URL では、"sofas" コントローラーが読み込まれ、その overview() メソッドが実行されます。これらの製品を親カテゴリ内にネストする必要があるまで、これはすべてうまく機能します。私が何を意味するかを示すために、前の 2 つの URL を使用します。

www.site.com/furniture/sofas/overview
www.site.com/electronics/video-games/overview

現在、「ビデオゲーム」コントローラーは「電子機器」コントローラー内にネストされています。ただし、現在の 'load controller -> execute action' 構造では、これは機能しません。

考えられる解決策は、存在しないアクションが要求された場合 (「ビデオゲーム」) に実行される親コントローラー (「電子機器」) 内にメソッドを作成することです。このメソッドは、要求されたアクションがコントローラーとして存在するかどうかを確認します。その場合、コントローラーがロードされ、そのアクション (「概要」) が実行されます。

ここSOを含め、標準のフロントコントローラーパターンのこの制限に対する解決策を無益に探しました。MVC の実装は正しいと思いますが、フロント コントローラーにはまだ制限があります。

4

2 に答える 2

1

製品タイプごとに異なる「コントローラー」が必要であるという考えは、問題に遭遇する可能性があると思います。

製品タイプごとに大幅に異なるビューを持たない限り、コントローラーは「カタログ」(または「製品」など、あなたがそれを呼びたいもの)などの概念にリンクされると思います. たとえば、URL 構造は次のようになります。

www.site.com/catalog/furniture/sofas/overview
www.site.com/catalog/electronics/video-games/overview

コントローラーを決定する URIのcatalog部分と、追加の URI セグメントは、本質的に、要求の詳細を示すコントローラーに渡されるパラメーターです。

これは、ルートの「製品」クラスを持ち、そのクラスを家具や電子機器などのサブクラスで拡張できるという点で、OOP 継承構造とうまく機能します。ソファ、ビデオゲームなどのさらなるサブクラスになります。

コントローラーが行う必要があるのは、リクエスト URI を評価して、リクエストに対してロードするクラスを決定することだけです。次のようなものです:

// assume URI has been parsed to get value such as "sofas", "video-games", etc. into a variable called $class_to_load
$product = new $class_to_load;
$product->overview();
于 2012-09-06T14:20:00.577 に答える
0

MVC 構造とルーティングの問題を混同しています。

コントローラは、おそらく製品コントローラまたはカテゴリ コントローラのようなものである必要があります。コントローラを機能別にグループ化します。

ルーティングは、リクエストの構造と、アプリケーション内のどこに送信されるかを処理します。

/<category>/<subcategory>/<action>応答を構築できるように、適切な引数 (つまり、カテゴリとサブカテゴリ) を使用して適切なコントローラー (製品コントローラーなど) に送信することを (たとえば) 認識しているルーティング層が必要です。

URL をコントローラーとアクションに直接マッピングする (つまり、 enforcing /<controller>/<action>) だけでは、アプリケーションのアーキテクチャーを構築する方法は非常に限られています。

于 2012-09-06T14:17:22.560 に答える