From b2a5967874aadb0df35d7b30b4e6331128b9d618 Mon Sep 17 00:00:00 2001 From: Ahmed TAILOULOUTE Date: Fri, 14 Feb 2020 17:46:38 +0100 Subject: [PATCH] [Routing] Use env() in route condition --- .../Resources/config/routing.xml | 4 ++ src/Symfony/Component/Routing/CHANGELOG.md | 1 + .../Matcher/ExpressionLanguageProvider.php | 41 ++++++++++++++++++ .../Tests/Matcher/ExpressionLanguageTest.php | 42 +++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 src/Symfony/Component/Routing/Matcher/ExpressionLanguageProvider.php create mode 100644 src/Symfony/Component/Routing/Tests/Matcher/ExpressionLanguageTest.php diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing.xml index 3482321a48ffc..e9385615022e4 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing.xml @@ -115,5 +115,9 @@ + + + + diff --git a/src/Symfony/Component/Routing/CHANGELOG.md b/src/Symfony/Component/Routing/CHANGELOG.md index 4c04edcb2f65e..87512710ddb3f 100644 --- a/src/Symfony/Component/Routing/CHANGELOG.md +++ b/src/Symfony/Component/Routing/CHANGELOG.md @@ -8,6 +8,7 @@ CHANGELOG * deprecated `RouteCollectionBuilder` in favor of `RoutingConfigurator`. * added "priority" option to annotated routes * added argument `$priority` to `RouteCollection::add()` + * added `ExpressionLanguageProvider` that provides `env` function. 5.0.0 ----- diff --git a/src/Symfony/Component/Routing/Matcher/ExpressionLanguageProvider.php b/src/Symfony/Component/Routing/Matcher/ExpressionLanguageProvider.php new file mode 100644 index 0000000000000..507602402d6bd --- /dev/null +++ b/src/Symfony/Component/Routing/Matcher/ExpressionLanguageProvider.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +use Symfony\Component\ExpressionLanguage\ExpressionFunction; +use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface; + +/** + * Defines some ExpressionLanguage functions. + * + * @author Ahmed TAILOULOUTE + */ +class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface +{ + /** + * {@inheritdoc} + */ + public function getFunctions() + { + return [ + new ExpressionFunction( + 'env', + static function ($str, $default = 'null') { + return sprintf('($_SERVER[%s] ?? %s)', $str, $default); + }, + static function ($arguments, $str, $default = null) { + return $_SERVER[$str] ?? $default; + } + ), + ]; + } +} diff --git a/src/Symfony/Component/Routing/Tests/Matcher/ExpressionLanguageTest.php b/src/Symfony/Component/Routing/Tests/Matcher/ExpressionLanguageTest.php new file mode 100644 index 0000000000000..1b9d80fb2b62e --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Matcher/ExpressionLanguageTest.php @@ -0,0 +1,42 @@ +registerProvider(new ExpressionLanguageProvider()); + + $this->assertEquals($expected, $expressionLanguage->evaluate($expression)); + } + + public function provider(): array + { + return [ + ['env("test__APP_ENV")', 'test'], + ['env("test__PHP_VERSION")', '7.2'], + ['env("test__unknown_env_variable")', null], + ['env("test__unknown_env_variable", "default")', 'default'], + ]; + } + + public function tearDown() + { + unset($_SERVER['test__APP_ENV'], $_SERVER['test__PHP_VERSION']); + } +}