@@ -28,9 +28,15 @@ final class BlockStack
28
28
*/
29
29
private array $ stack ;
30
30
31
+ /**
32
+ * @var array<class-string, int>
33
+ */
34
+ private static array $ templateIndexStack = [];
35
+
31
36
public function convert (array $ blocks , int $ targetEmbeddedTemplateIndex ): array
32
37
{
33
38
$ newBlocks = [];
39
+ $ hostEmbeddedTemplateIndex = null ;
34
40
foreach ($ blocks as $ blockName => $ block ) {
35
41
// Keep already converted outer blocks untouched
36
42
if (str_starts_with ($ blockName , self ::OUTER_BLOCK_PREFIX )) {
@@ -41,7 +47,7 @@ public function convert(array $blocks, int $targetEmbeddedTemplateIndex): array
41
47
// Determine the location of the block where it is defined in the host Template.
42
48
// Each component has its own embedded template. That template's index uniquely
43
49
// identifies the block definition.
44
- $ hostEmbeddedTemplateIndex = $ this ->findHostEmbeddedTemplateIndex ();
50
+ $ hostEmbeddedTemplateIndex ?? = $ this ->findHostEmbeddedTemplateIndex ();
45
51
46
52
// Change the name of outer blocks to something unique so blocks of nested components aren't overridden,
47
53
// which otherwise might cause a recursion loop when nesting components.
@@ -69,12 +75,10 @@ private function findHostEmbeddedTemplateIndex(): int
69
75
{
70
76
$ backtrace = debug_backtrace (\DEBUG_BACKTRACE_IGNORE_ARGS | \DEBUG_BACKTRACE_PROVIDE_OBJECT );
71
77
72
- $ componentTemplateClassName = null ;
73
-
74
78
foreach ($ backtrace as $ trace ) {
75
79
if (isset ($ trace ['object ' ]) && $ trace ['object ' ] instanceof Template) {
76
80
$ classname = $ trace ['object ' ]::class;
77
- $ templateIndex = $ this -> getTemplateIndexFromTemplateClassname ($ classname );
81
+ $ templateIndex = self :: getTemplateIndexFromTemplateClassname ($ classname );
78
82
if ($ templateIndex ) {
79
83
// If there's no template index, then we're in a component template
80
84
// and we need to go up until we find the embedded template
@@ -93,7 +97,7 @@ private function findCallingEmbeddedTemplateIndex(): int
93
97
94
98
foreach ($ backtrace as $ trace ) {
95
99
if (isset ($ trace ['object ' ]) && $ trace ['object ' ] instanceof Template) {
96
- return $ this -> getTemplateIndexFromTemplateClassname ($ trace ['object ' ]::class);
100
+ return self :: getTemplateIndexFromTemplateClassname ($ trace ['object ' ]::class);
97
101
}
98
102
}
99
103
}
@@ -108,7 +112,7 @@ private function findHostEmbeddedTemplateIndexFromCaller(): int
108
112
foreach ($ backtrace as $ trace ) {
109
113
if (isset ($ trace ['object ' ]) && $ trace ['object ' ] instanceof Template) {
110
114
$ classname = $ trace ['object ' ]::class;
111
- $ templateIndex = $ this -> getTemplateIndexFromTemplateClassname ($ classname );
115
+ $ templateIndex = self :: getTemplateIndexFromTemplateClassname ($ classname );
112
116
if (null === $ renderer ) {
113
117
if ($ templateIndex ) {
114
118
// This class is an embedded template.
@@ -139,8 +143,8 @@ private function findHostEmbeddedTemplateIndexFromCaller(): int
139
143
return 0 ;
140
144
}
141
145
142
- private function getTemplateIndexFromTemplateClassname (string $ classname ): int
146
+ private static function getTemplateIndexFromTemplateClassname (string $ classname ): int
143
147
{
144
- return (int ) substr ($ classname , strrpos ($ classname , '___ ' ) + 3 );
148
+ return self :: $ templateIndexStack [ $ classname ] ??= (int ) substr ($ classname , strrpos ($ classname , '___ ' ) + 3 );
145
149
}
146
150
}
0 commit comments