私が理解しているように、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 を追加する必要があります。
それは完全に機能しますが、正確には「きれい」ではありません。
私の質問: この戦略を達成するためのより良い方法はありますか?