1

アプリケーションで遭遇した競合/難問について質問があります。

キャッシュからのデータやセッション情報、PDO ラッパーのメソッドなど、すべてのモデルとコントローラーで共通の「もの」を利用できるようにしたいと考えています。

現在、個々の機能コントローラーと機能モデルはそれぞれ、ベース コントローラーとベース モデルを拡張し、それらは共通の処理をすべて実行する単一のオブジェクトを拡張します。

コントローラーはルーター/ディスパッチャーによって呼び出され、コントローラーはモデルを呼び出してデータを取得します。これの問題は、メイン オブジェクトが 2 回構築されることを意味します。1 回目は機能コントローラーが呼び出されたとき、もう 1 つは機能コントローラーが機能モデルを呼び出したときです。

以下の図を参照してください。

現在の MVC アプリの構造

明らかに私は何か間違ったことをしているので、この問題に対する何らかのベストプラクティスの解決策があるかどうか疑問に思っていました.

私が望んでいないのは、オブジェクトがロードするものをコントローラーを介してモデルに渡す必要があることです。つまり、新しい共通要素をオブジェクトに追加する必要があるときはいつでも、それをモデルに渡す必要があります。

$this->cache または $this->db または $this->session をコントローラーとモデルの両方で常に普遍的に利用できるようにする方がはるかに単純で簡単です (将来のヘルパーやその他のクラスも同様です)。

この問題を解決するにはどうすればよいですか?

ありがとう :)

4

2 に答える 2

0

あなたはこの問題を解決することについて間違った道を進んでいると思います。MVCアプリケーションを構築している場合は、関心の分離を行う必要があります。そのため、MVCを使用しています。モデル、コントローラー、ビューを分離します。

Modelで何をする必要があるか、Controllerで何をするかを定義し、プレゼンテーションロジックにのみViewを使用する必要があります。

適切なMVCでは、Modelはビジネスロジック、データベースアクセス、検証などを処理するレイヤーです。したがって、Modelは1つのクラスではありません。また、1つのコントローラーで多くのモデルを使用できます。そしてコントローラーはただ...モデルとビューの間の接続です。モデルは太く、コントローラーは軽くする必要があります。

モデルとコントローラーの両方で同じことを行うことができ、それがMVCの目的ではないため、これを行う方法は私の意見では間違っています。コントローラーはロジックを実行するべきではありません。そのため、モデルを使用します。コントローラーはモデルに何をすべきかを指示するだけであり、その反応に基づいて、他のモデルに他のことを実行するように指示するか、成功またはエラーメッセージまたはデータベースからの投稿などでビューをレンダリングします。

これを行う方法は、適切なコントローラーを呼び出したら、それを使用して必要なモデルを取得することです。また、モデルは多数のクラスで構成されているため、モデルフォルダーが太くなる可能性があります。Controllerからは、モデルがいくつかのアクションを実行し、実行したことをControllerに報告できるように、モデルにアクセスするためのメソッドのみが必要です。そして、その戻り値に基づいて、さらにいくつかのアクションを実行するか、Viewを呼び出してレンダリングします。

したがって、モデルとコントローラーの両方で拡張できるオブジェクトを1つ持つべきではありません。

モデルフォルダは次のようになります。

Models
    - Entities
    - Forms
    - Validators
    - Services
    ...

次に、コントローラーでそれらのいずれかを呼び出してアクションを実行し、報告します。コントローラーとモデルの両方で同じ機能が本当に必要な場合、これはあなたの質問に答えませんでしたが、あなたが始めたようにそれを行うのは間違っていると思います。

これがお役に立てば幸いです。興味深い質問です。できれば、もう少し助けてみてください。

于 2012-10-20T15:18:56.407 に答える
0

あなたの問題の根本は悪いアーキテクチャにあると感じています。

MVC および MVC にインスパイアされたデザイン パターンについて理解しなければならない主な点は、パターンが 2 つのレイヤー (プレゼンテーション レイヤーとモデル レイヤー) で構成されていることです。これらのレイヤーは、共通の機能を共有するべきではありません。コントローラー (およびビューとテンプレート) は、プレゼンテーション層の一部です。

$this->cache$this->dbまたはコントローラーのような変数が$this->sessionある場合、抽象化の重大なリークがあることを意味します。これらはストレージ構造であり、モデル層のかなり深いところに隠されている必要があります。コントローラーがそれらと直接対話している場合、コントローラーはありません。

次の問題は、基本クラスです (オブジェクトはクラスのインスタンスのようなものですが、何らかの理由で呼び出すObjectクラスです) 。特にストレージとの相互作用のためのさまざまな抽象化のインスタンス化など、かなり多くのことを担っているようです。コントローラーに PDO インスタンスが必要な場合(非常に奇妙な理由で)、コンストラクターに注入する必要があります。キャッシュとセッション管理についても同様です。

そして、モデルはオブジェクトでもクラスでもないという小さなことがあります。レイヤーです。また、プレゼンテーション層と同様に、さまざまな種類の構造から構成されています。通常、推奨事項は次のとおりです。

はい、コントローラーを使用して構造を渡すことは悪い習慣であると仮定すると、あなたは正しいです。LoDに違反しています。代わりに、コントローラーにファクトリを提供する必要があります。これにより、モデルレイヤー構造がインスタンス化され、必要な依存関係が提供されます..この投稿が役立つ場合があります。

この件についての私の2セント..より正確なアドバイスについては、いくつかのコードを表示する必要があります

于 2012-10-21T00:25:30.287 に答える