Skip to content

Commit db5bfea

Browse files
falkenhawkpartikus
authored andcommitted
Optimize compiled string definitions
- run preg_replace_callback already during compilation
1 parent f0ca9a0 commit db5bfea

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

src/CompiledContainer.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Invoker\ParameterResolver\DefaultValueResolver;
1717
use Invoker\ParameterResolver\NumericArrayResolver;
1818
use Invoker\ParameterResolver\ResolverChain;
19+
use Psr\Container\NotFoundExceptionInterface;
1920

2021
/**
2122
* Compiled version of the dependency injection container.
@@ -125,4 +126,21 @@ protected function resolveFactory($callable, $entryName, array $extraParameters
125126
throw new InvalidDefinition("Entry \"$entryName\" cannot be resolved: " . $e->getMessage());
126127
}
127128
}
129+
130+
/**
131+
* Resolve a placeholder in string definition
132+
* - wrap possible NotFound exception to conform to the one from StringDefinition::resolveExpression.
133+
*/
134+
protected function resolveStringPlaceholder($placeholder, $entryName)
135+
{
136+
try {
137+
return $this->delegateContainer->get($placeholder);
138+
} catch (NotFoundExceptionInterface $e) {
139+
throw new DependencyException(sprintf(
140+
"Error while parsing string expression for entry '%s': %s",
141+
$entryName,
142+
$e->getMessage()
143+
), 0, $e);
144+
}
145+
}
128146
}

src/Compiler/Compiler.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,12 @@ private function compileDefinition(string $entryName, Definition $definition) :
213213
}
214214
break;
215215
case $definition instanceof StringDefinition:
216-
$entryName = $this->compileValue($definition->getName());
217-
$expression = $this->compileValue($definition->getExpression());
218-
$code = 'return \DI\Definition\StringDefinition::resolveExpression(' . $entryName . ', ' . $expression . ', $this->delegateContainer);';
216+
$expression = $definition->getExpression();
217+
$callback = function (array $matches) use ($definition) {
218+
return '\'.$this->resolveStringPlaceholder(' . $this->compileValue($matches[1]) . ', ' . $this->compileValue($definition->getName()) . ').\'';
219+
};
220+
$value = preg_replace_callback('#\{([^\{\}]+)\}#', $callback, $expression);
221+
$code = 'return \'' . $value . '\';';
219222
break;
220223
case $definition instanceof EnvironmentVariableDefinition:
221224
$variableName = $this->compileValue($definition->getVariableName());

0 commit comments

Comments
 (0)