diff --git a/Tests/Unit/TokenProvider/ExpressionProviderTest.php b/Tests/Unit/TokenProvider/ExpressionProviderTest.php new file mode 100644 index 0000000..d9160de --- /dev/null +++ b/Tests/Unit/TokenProvider/ExpressionProviderTest.php @@ -0,0 +1,61 @@ +article = $this->prophesize('Symfony\Cmf\Component\RoutingAuto\Tests\Resources\Fixtures\Article'); + $this->uriContext = $this->prophesize('Symfony\Cmf\Component\RoutingAuto\UriContext'); + $this->provider = new ExpressionProvider(new ExpressionLanguage()); + } + + public function provideGetValue() + { + return array( + array( + 'hello', + 'subject.getTitle()', + 'hello', + ), + ); + } + + /** + * @dataProvider provideGetValue + */ + public function testGetValue($title, $expression, $expected) + { + $this->uriContext->getSubjectObject()->willReturn($this->article); + $this->article->getTitle()->willReturn($title); + + $options = array( + 'expression' => $expression + ); + + $res = $this->provider->provideValue($this->uriContext->reveal(), $options); + $this->assertEquals($expected, $res); + } +} diff --git a/TokenProvider/ExpressionProvider.php b/TokenProvider/ExpressionProvider.php new file mode 100644 index 0000000..3cef9af --- /dev/null +++ b/TokenProvider/ExpressionProvider.php @@ -0,0 +1,58 @@ +language = $language; + } + + /** + * {@inheritDoc} + */ + public function provideValue(UriContext $uriContext, $options) + { + $subject = $uriContext->getSubjectObject(); + $expression = $options['expression']; + $evaluation = $this->language->evaluate($expression, array( + 'subject' => $subject + )); + + return $evaluation; + } + + /** + * {@inheritDoc} + */ + public function configureOptions(OptionsResolverInterface $optionsResolver) + { + $optionsResolver->setRequired(array( + 'expression', + )); + + $optionsResolver->setAllowedTypes(array( + 'expression' => 'string', + )); + } +}