1

これらの 2 つのよく言われる MVC アドバイスは、互いに矛盾しているように見えます。

  1. ビューに for ループまたは条件付きロジックがない
  2. ビュー以外の場所に HTML はありません

順序付けられていないリストとして出力する必要がある $items があるとします。反復ロジックは html を含むようにバインドされていませんか? その場合、どこに置けばいいですか?

テンプレートの作成者にタグ、クラスなどのパラメーターを提供しながら、ビュー以外の場所に配置することを再利用性が主張しているように思えます。

どう思いますか?あなたがそう考える実際的な理由は大歓迎です。

4

2 に答える 2

0

ビュー テンプレートでリストやテーブルを扱うときは、常にある種のループが発生します。テンプレートにビュー ロジックを追加するのはよくないと主張する人がいる理由は、ViewModel パラダイムに関連しています。

データをループするだけでは不十分な場合があります。次に例を示します。

<?php foreach( $users as $user ): ?>
    <?php if ( in_array( $user->getId(), $members ) ): ?>
    <!-- Users is member -->

この特定のケースでは、ユーザーがメンバーであるかどうかを確認user entityするメソッドがありません。isMember()ユーザーエンティティに同梱されているサードパーティモジュールを使用していて、これを拡張して新しい依存関係 (グループなど) を追加したくないと仮定します。上記の例のようにビュー テンプレートを適切に表示するには、ドメイン モデルの外部でこれを確認する必要があります。

ただし、この場合、ビューにロジックを追加しています: if ( in_array( $user->getId(), $members ) )ビジネス ロジックまたはビュー ロジック内に配置する必要があります。後者はViewModelsを使用して実現されます。したがって、ビューをドメイン モデル オブジェクトと対話させる代わりに、メソッドを実装して上記のロジックをカプセル化する ViewModel と対話します。isMember()

このパラダイムの主な考え方は、ビューはドメイン モデルにアクセスできず、代わりに ViewModel とのみ対話し、ビューをドメイン モデルから独立させておくというものです。

アップデート

たとえば、デザイン/フロントエンド チームがいる場合は、呼び出しを許可しませんが、ViewModel$user->setName()だけを使用する場合は、このメソッドをオプションとして含めません。$user->getName()

別の例があります。アプリケーションにスキン/テーマがあるとしましょう。ビュー テンプレートの最初の例のように、ビュー ロジックを保持する場合は、同様のテンプレートを使用してすべてのテーマに対してこのロジックを複製する必要があります。これをテンプレートから切り離すことで、重複したビュー ロジックがビュー テンプレート全体に広がることを回避できます。

于 2012-09-01T22:16:54.913 に答える
0

もちろん、ビューにループを配置することもできます。他にどのように<ul>s をレンダリングしますか? :))

主にテンプレートの共有部分で、承認ステータスに基づいて右上に「ログアウト」と「ログイン」を印刷するなど、少し条件付きロジックを配置することもできます。

全体的なポイントは、ビュー レイヤーがレンダリングするデータに完全に依存しない必要があるということです。彼は、一連の配列/オブジェクトと、ブラウザーでレンダリングされる実際の HTML の間の境界線です。そのようなデータを提供すること、つまり、すべての決定、フィルタリングなどを行うことは、コントローラーの問題です。

Web サービスについて考えてみてください。同じリソースをさまざまな形式 [xml、json、プレーン html] でレンダリングできます。どこからでもデータを取得するのはコントローラーであり、ビューはそれを取得して適切なドキュメントをレンダリングします。

于 2012-09-01T18:51:43.710 に答える