From b89a8e7cf8e71df8b090f566c5c7e12cec3fb3af Mon Sep 17 00:00:00 2001 From: Matthias Pigulla Date: Wed, 26 Jun 2024 09:20:09 +0200 Subject: [PATCH] Keep parsed expressions at least during the current request --- src/JMS/ObjectRouting/ObjectRouter.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/JMS/ObjectRouting/ObjectRouter.php b/src/JMS/ObjectRouting/ObjectRouter.php index 89403a9..74a330e 100644 --- a/src/JMS/ObjectRouting/ObjectRouter.php +++ b/src/JMS/ObjectRouting/ObjectRouter.php @@ -24,6 +24,7 @@ use Metadata\MetadataFactory; use Metadata\MetadataFactoryInterface; use Symfony\Component\ExpressionLanguage\ExpressionLanguage; +use Symfony\Component\ExpressionLanguage\ParsedExpression; use Symfony\Component\PropertyAccess\PropertyAccessor; class ObjectRouter @@ -33,22 +34,23 @@ class ObjectRouter private $accessor; private $expressionLanguage; - public static function create(RouterInterface $router) + public static function create(RouterInterface $router, ?ExpressionLanguage $expressionLanguage = null) { return new self( $router, new MetadataFactory(new DriverChain([ new AttributeDriver(), - ])) + ])), + $expressionLanguage ); } - public function __construct(RouterInterface $router, MetadataFactoryInterface $metadataFactory) + public function __construct(RouterInterface $router, MetadataFactoryInterface $metadataFactory, ?ExpressionLanguage $expressionLanguage = null) { $this->router = $router; $this->metadataFactory = $metadataFactory; $this->accessor = new PropertyAccessor(); - $this->expressionLanguage = new ExpressionLanguage(); + $this->expressionLanguage = $expressionLanguage ?? new ExpressionLanguage(); } /** @@ -90,6 +92,10 @@ public function generate($type, $object, $absolute = false, array $extraParams = } foreach ($route['paramExpressions'] as $k => $expression) { + if (!$expression instanceof ParsedExpression) { + $expression = $this->expressionLanguage->parse($expression, ['this']); + $metadata->routes[$type]['paramExpressions'][$k] = $expression; + } $evaluated = $this->expressionLanguage->evaluate($expression, ['this' => $object]); if ($k[0] === '?') { if ($evaluated === null) {