Skip to content

Commit 7d72241

Browse files
falkenhawkpartikus
authored andcommitted
Optimize compiled string definitions
- run preg_replace_callback already during compilation
1 parent 049963c commit 7d72241

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

src/CompiledContainer.php

+18
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.
@@ -112,4 +113,21 @@ protected function resolveFactory($callable, $entryName, array $extraParameters
112113
throw new InvalidDefinition("Entry \"$entryName\" cannot be resolved: " . $e->getMessage());
113114
}
114115
}
116+
117+
/**
118+
* Resolve a placeholder in string definition
119+
* - wrap possible NotFound exception to conform to the one from StringDefinition::resolveExpression.
120+
*/
121+
protected function resolveStringPlaceholder($placeholder, $entryName)
122+
{
123+
try {
124+
return $this->delegateContainer->get($placeholder);
125+
} catch (NotFoundExceptionInterface $e) {
126+
throw new DependencyException(sprintf(
127+
"Error while parsing string expression for entry '%s': %s",
128+
$entryName,
129+
$e->getMessage()
130+
), 0, $e);
131+
}
132+
}
115133
}

src/Compiler/Compiler.php

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

0 commit comments

Comments
 (0)