getExpressionLanguageProviders()[$context] ?? []; // Always add default provider array_unshift($providers, DefaultProvider::class); $providers = array_unique($providers); $functionProviders = []; $generalVariables = []; foreach ($providers as $provider) { /** @var ProviderInterface $providerInstance */ $providerInstance = GeneralUtility::makeInstance($provider); $functionProviders[] = $providerInstance->getExpressionLanguageProviders(); $generalVariables[] = $providerInstance->getExpressionLanguageVariables(); } $functionProviders = array_merge(...$functionProviders); $generalVariables = array_replace_recursive(...$generalVariables); $this->expressionLanguageVariables = array_replace_recursive($generalVariables, $variables); foreach ($functionProviders as $functionProvider) { /** @var ExpressionFunctionProviderInterface[] $functionProviderInstances */ $functionProviderInstances[] = GeneralUtility::makeInstance($functionProvider); } $this->expressionLanguage = new ExpressionLanguage(null, $functionProviderInstances); } /** * Evaluate an expression. */ public function evaluate(string $expression, array $contextVariables = []): mixed { return $this->expressionLanguage->evaluate($expression, array_replace($this->expressionLanguageVariables, $contextVariables)); } /** * Compiles an expression to source code. * Currently unused in core: We *may* add support for this later to speed up condition parsing? */ public function compile(string $condition): string { return $this->expressionLanguage->compile($condition, array_keys($this->expressionLanguageVariables)); } }