問題:
HTML/PHPコードの混合シーケンス、以下の疑似コードがあると考えてください:
<html>
<section 1> ... </section 1>
<section 2> ... </section 2>
<section 3> ... </section 3>
</html>
セクションは HTML/PHP コードの単なるブロックであり、詳細は重要ではないことに注意してください。
ただし、ストーリーにとって重要ではない理由により、最初にセクション 3 と 2 でコードをレンダリングし、次にセクション 1 でレンダリングしたいと考えています。従来の PHP/HTML では、無名関数を使用してそれを実現します。
<?php $buff = []; ?>
<?php $buff[] = function() { ?>
<html>
<?php }; ?>
<?php $buff[] = function() { ?>
<section 1> </section 1>
<?php }; ?>
<?php $buff[] = function() { ?>
<section 2> </section 2>
<?php }; ?>
<?php $buff[] = function() { ?>
<section 3> </section 3>
<?php }; ?>
<?php $buff[] = function() { ?>
</html>
<?php }; ?>
<?php
for ($i = count($buff)-1; $i >= 0; $i--) {
$buff[$i] = call_user_func($buff[$i]);
}
foreach($buff as $b) echo $b;
?>
お分かりのように、無名関数を介してレンダリングの順序を制御します。セクションのどれも前のセクションの実行結果に依存しないことに注意してください。
述べられた -> アイデアを達成するためには、Twig の Node ビジターを使用することです。もちろん、これらの無名関数には $context 変数と $blocks 変数への参照があります。
function () use ($context, $blocks) {
...
}
これはかなり二重です。今、質問は次のとおりです。より良い方法はありますか?私が見逃している潜在的な危険はありますか?
ご了承ください
<?php
for ($i = 0; $i < count($buff); $i++) {
$buff[$i] = call_user_func($buff[$i]);
}
foreach($buff as $b) echo $b;
?>
テンプレートを変更していないため、コード実行の順序と同じ結果が得られるはずです。
現在、これはテンプレートで特定のタグが検出された場合にのみ使用されます。この実行の順序変更の目的は、このタグがテンプレートの上にある場合でも -> 最後に実行されますが、上に表示されるようにすることです。
他の回避策はありません->最後に実行され、一番上に表示されるようにする必要があります。
ありがとうございました