1

私が理解しているように、Twig のようなテンプレート エンジンの主な設計思想は、ビューからすべての PHP コードを削除し、ビューをレンダリングするコントローラーにそのビューに必要なすべてのパラメーターを設定させることです。

ただし、ビューがヘッダー、フッター、ショッピング カート、商品リストなどのさまざまな「ブロック」で構成されていると想像してください。order_controller.php で、顧客がログインしているかどうかを確認し (ログインしていない場合、ヘッダーに「ログオフ」リンクが含まれていないため)、利用可能なすべての製品のリストを取得します (それらを$_SESSION でショッピング カートの内容をフェッチするだけでなく (shoppingcart ブロックで表示するため)。

ただし、order_controller が 1 つのもののみをフェッチするようにした方が興味深い場合があります: 製品のリストです。コントローラーによってレンダリングされるビューには、他のブロック (ヘッダー、フッター、ショッピング カート) のさまざまなインクルードが含まれますが、ビューは含まれません。それらには他のコントローラー (showheader_controller、showfooter_controller、および showcart_controller) が含まれ、それらは独自の単一ブロックをレンダリングします (showheader_controller はヘッダービューのみをレンダリングします…)。つまり、ビューをレンダリングするコントローラーをメイン ビューに含めます。顧客がログインしているかどうかを確認するロジックは、showheader_controller になります。これは、これを知る必要があるのはヘッダー ビューだけであるという単純な理由によるものです。

このように、すべてがヘッダーを表示する大量のコントローラーを使用できますが、各コントローラーにロジックを繰り返して顧客がログインしているかどうかを確認する代わりに、1 つの場所 (ヘッダーをレンダリングするコントローラー) にのみ配置します。ヘッダービュー)。ビューのその場所に外部ソースを含める Twig 関数があれば、問題は修正されます (他のコントローラーを含めることができるため) が、そのままでは他のテンプレートを含めることしかできません (それはできません)。それらにPHPロジックが含まれていると、目的が達成できなくなります)。

これを修正する方法は、order_controller に次のロジックを持たせることです。

  • 商品リストを取得する
  • 出力ストリームのバッファリングを開始します (ob_start())
  • ヘッダーをレンダリングするコントローラーを含めます (showheader_controller)
  • バッファの内容を変数 $headerView に格納します。
  • バッファをクリーンアップする
  • 出力ストリームのバッファリングを開始します (ob_start())
  • ショッピング カートをレンダリングするコントローラーを含める (showcart_controller)
  • バッファの内容を変数 $cartView に格納します。
  • バッファをクリーンアップする
  • 洗い流して繰り返し…

ビューでは、設定された変数の内容を出力します。

{{ headerView | raw }}

headerView 変数には html タグが含まれているため、raw-filter を追加する必要があります。

それは完全に機能しますが、正確には「きれい」ではありません。

私の質問: この戦略を達成するためのより良い方法はありますか?

4

1 に答える 1

3

まず、MVC 分離をより適切に実装することで、これを簡素化できます。コントローラの仕事は、イベントに反応し、このイベントに反応して適切なことをモデルに実行させることだけです。ビューを操作するのはコントローラの仕事ではなく、ビューがコントローラに完全に依存しているわけでもありません。

モデルはコア アプリケーションであり、アプリケーションが実行するすべてのことをモデル化します。ビューの仕事は、アプリケーションで何が起こっているかを視覚化し、ユーザーが何か操作できるようにすることです。コントローラーは、ユーザーとアプリケーションの間の小さな接着剤であり、ユーザーがアプリケーションを制御できるようにするものです。

そのため、コントローラーは「ユーザーがホームページを訪問した」などのイベントに反応し、モデルで必要なイベントをトリガーします。これにより、ビューが更新され、アプリケーションの新しい状態が表されます。ビューは、必要なことは何でも実行できます。ビューは単なる Twig テンプレートではありません。ビューはモデルと対話して、より多くの情報を取得できます。最終的に、必要なデータを Twig テンプレートに送信する必要があるのはコントローラーではなく、レンダリングする前にテンプレートに必要なデータを設定する必要があるのはビューです。コントローラーのコードを減らし、ビューのコードを増やします。

これをよりモジュール化したい場合は、フェッチが必要な場所から必要なデータをフェッチできるカスタム Twig タグまたは関数を定義できます。例えば:

<div class="head">{{ user_login_status() }}</div>

user_login_statusステータスを表示するために必要なデータを取得するためにモデルと通信できる Twig 拡張関数です。

アイデアが得られることを願っています。

于 2013-02-28T12:48:00.243 に答える