[ExpressionLanguage] Fixed expressions cache key generation

This commit is contained in:
Anton Bakai 2015-08-14 15:56:24 +03:00 committed by Fabien Potencier
parent 6963887589
commit 4114a2bd3e
2 changed files with 42 additions and 1 deletions

View File

@ -84,7 +84,14 @@ class ExpressionLanguage
return $expression;
}
$key = $expression.'//'.implode('-', $names);
asort($names);
$cacheKeyItems = array();
foreach ($names as $nameKey => $name) {
$cacheKeyItems[] = is_int($nameKey) ? $name : $nameKey.':'.$name;
}
$key = $expression.'//'.implode('|', $cacheKeyItems);
if (null === $parsedExpression = $this->cache->fetch($key)) {
$nodes = $this->getParser()->parse($this->getLexer()->tokenize((string) $expression), $names);

View File

@ -104,4 +104,38 @@ class ExpressionLanguageTest extends \PHPUnit_Framework_TestCase
array('true or foo', array('foo' => 'foo'), true),
);
}
public function testCachingForOverriddenVariableNames()
{
$expressionLanguage = new ExpressionLanguage();
$expression = 'a + b';
$expressionLanguage->evaluate($expression, array('a' => 1, 'b' => 1));
$result = $expressionLanguage->compile($expression, array('a', 'B' => 'b'));
$this->assertSame('($a + $B)', $result);
}
public function testCachingWithDifferentNamesOrder()
{
$cacheMock = $this->getMock('Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface');
$expressionLanguage = new ExpressionLanguage($cacheMock);
$savedParsedExpressions = array();
$cacheMock
->expects($this->exactly(2))
->method('fetch')
->will($this->returnCallback(function ($key) use (&$savedParsedExpressions) {
return isset($savedParsedExpressions[$key]) ? $savedParsedExpressions[$key] : null;
}))
;
$cacheMock
->expects($this->exactly(1))
->method('save')
->will($this->returnCallback(function ($key, $expression) use (&$savedParsedExpressions) {
$savedParsedExpressions[$key] = $expression;
}))
;
$expression = 'a + b';
$expressionLanguage->compile($expression, array('a', 'B' => 'b'));
$expressionLanguage->compile($expression, array('B' => 'b', 'a'));
}
}