2009-08-05 8 views
0

最近、私はWeb開発の標準MVC設定を改良/廃止しようとしていましたが、私は自分のアイデアをStackOverflowに投げ込むことになったと思いました。MVCからの離脱

一般的な流れは、ブートストラップが初期オブジェクトを作成する点で同じです。違いは、これらがServiceManagerに保持されることです。

コントローラをディスパッチする代わりに、ビューをロードします。

ビューは、コマンドとクエリを呼び出します。コマンドは、一般的にフォームに関連する機能(一般的にデータベース行を更新する機能)を表し、クエリは通常ModelPeersとなります。これらが(ServiceManagerを介して)作成されると、それらにServiceManagerが渡され、潜在的に複雑な依存関係注入の必要性がなくなります。

モデル自体は、単一行で作成/更新/削除を行うだけです。

ので、ビューは次のようになります。ListUsers.php

<?php $users = $this->ServiceManager->get('Query\User')->getNewestUsers(10); ?> 

<?php foreach($users as $user): ?> 
.... 
<?php endforeach; ?> 

UpdateUser.php

<?php $this->ServiceManager->get('Command\User')->update(); ?> 

<form>...</form> 

私はいくつかの階層違反があることを知っているが、それはより多くのクリーンなようです何よりもViewVariableSettersのような動作をするコントローラがたくさんあります。

また、すべての機能がコマンドやクエリにカプセル化されているため、大きなコントローラから離れているため、すべてをテストすることができます。技術的には、私はコントローラまたはViewVariableSetterを持つことができましたが、それは非常にわずかな利点を持つ多くのコードを追加するように思えます。

フィードバックをいただければ幸いです。私が何かを明確にすることができれば教えてください。

+0

私は数時間外出するつもりですが、私が帰るとすぐに新しい反応を得るでしょう。 – whichdan

答えて

3

は、プロジェクトに別の開発者を追加した後、プロジェクトが大きくなったときにほとんど役に立たないと感じます。コントローラとモデルからビューを分離して感謝します。

+0

コマンドとクエリはすでに分離されています。ビュー内の唯一のものは、それらの呼び出しです。 – whichdan

+1

@whichdan 前のコメントが何らかの指示であった場合、「パッシブビュー」MVCと呼ばれるものがあるかもしれません: http://martinfowler.com/eaaDev/PassiveScreen.html – Nolte

0

さまざまな形式に合わせてビューを調整するにはどうすればよいですか?例:HTMLレスポンス、jsonレスポンスなど

+0

JSONまたはXMLを印刷してヘッダーコンテンツタイプ。 – whichdan

+0

リクエストを受け取り、送信する 'ビュー' /レスポンスを決定するオブジェクトが必要です。 – koen

+0

ルータはそれを処理できます。 – whichdan

3

MVCが嫌いなら、兄弟のMVP(Model-View-Presenter)、PM(Presentation Model)、MVVM(Model-View-ViewModel)を見ることができます。

実際、あなたの説明はPMかもしれませんが、わかりません。

+0

M-V-PMは私がやっていることに非常に近い音を出します。しかし、特に小さなWebアプリケーションでは、比較的シンプルなもののために3-4ファイルを変更する必要があります。 – whichdan

+0

Dan、これは一般的なアプローチであると思われますか、これはあなたが考えている単一のサイトですか? –

+0

一般的なアプローチ。私はこれを異なるサイズ/範囲の複数のWebアプリケーションに適用しようとしています。 – whichdan

1

ここで良いスタートを1つは、再利用可能な/モジュラコードをからコントローラと呼びます。これは、gigantoモノリシックコントローラではなく、コントローラです。

私の意見:たぶん問題は、 "V"(ビュー)についての現在のドグマとして、あまり "MVC"ではないでしょう。現在のドグマは、ビューである必要があります(HTML)テンプレートである必要があります。このテンプレートでは、コードを "オブジェクトd 'アート"に織り込む必要があります。多くのアプリケーションでは、これは単なる作業であると主張することができます。

マーケティングキオスク(をアートワークにする必要があります)とは対照的に、CRUD編集タスクを設定するときは、フォームやその他のオブジェクトを生成するAPIを作成しますUI要素はブラウザ(またはJava AWT)のようなjavascriptのような "DOM"モデルを使用していますか?ちょっとした考え。コメントに反応して


を「...私はちょうどビューにものを渡すクラスを持つ避けたい...」

まず第一に、それはになんとかする必要がありますこれが最小限の作業量である場合は最小限のコードにしてください。例えば、 "Rails"がアプリケーションの特定の "領域"内の要求をクラスに自動的にルーティングし、要求を個々の関数/ハンドラにマッピングする方法が好きです。私は応答をより簡潔に保つために、Javaコードでこの動作をエミュレートしました。

第2に、この「ビューに情報を渡す」は、「単純なステップのパイプラインに沿ってデータを渡して計算して格納する」という特定のインスタンスに過ぎません。コードを理解して維持しやすくします。私はハードコアの「関数型プログラミング」ファンではありませんが、コードの中でデータフローを(簡単に)理解できると言われるものがあります。副次的な利点として、(非直感的には)コードを実際に少し速く実行させることがよくあります。私は前に "地方"について怒っていたので、ここでは繰り返さない。

+0

私はコントローラの中からコマンドやクエリを使うことを考えていましたが、もう一度、ビューに物を渡すだけのクラスを避けたいのです。それは必然的に多くの場合に終了します。 コード生成はうまくいくかもしれませんが、一般的にHTML/JSON/XMLが本当に複雑であるとは限りません。 – whichdan

0

MVCは、Webの興味深いデザインのビットです。ほとんどの場合、ビューとコントローラーの分離は本当に必要ありません。一方、アプリケーションの状態としてのurlの動作のため、あなたは2つの間の相互運用性のいくつかのレベルが必要です。これは、2つのシナリオのうちの1つにつながります。あなたは部分的な分離だけを得るか、あるいは複雑になるかのどちらかです。どちらも非常に有益ではない。

私はほとんどのフレームワークがリラックスした分離を選ぶと言います。 RailsとそのPHPクローンは、一般にこの戦略に従います。個人的に私は実際にその点を見ていない。 2層(例えば、モデル/プレゼンテーション)設計は、大半のアプリケーションでうまく機能します。

業界標準を使用しても、間違っていると言われることがありますが、それは単に標準だからです。あなた自身のアーキテクチャを調理するなら、他の開発者はそれを理解するのにもっと時間を費やすでしょう。そのようなものを得るためには、そこでの作業の量を過小評価すべきではありません。

関連する問題