Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 84a22c6

Browse filesBrowse files
committed
[Routing] Use env() in route condition
1 parent f46ab58 commit 84a22c6
Copy full SHA for 84a22c6

File tree

7 files changed

+149
-2
lines changed
Filter options

7 files changed

+149
-2
lines changed

‎src/Symfony/Bundle/FrameworkBundle/Resources/config/routing.xml

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Resources/config/routing.xml
+16Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,17 @@
6868
<argument type="service" id="parameter_bag" on-invalid="ignore" />
6969
<argument type="service" id="logger" on-invalid="ignore" />
7070
<argument>%kernel.default_locale%</argument>
71+
<argument type="collection">
72+
<argument type="service" key="get_env">
73+
<service class="Closure">
74+
<factory class="Closure" method="fromCallable" />
75+
<argument type="collection">
76+
<argument type="service" id="service_container" />
77+
<argument>getEnv</argument>
78+
</argument>
79+
</service>
80+
</argument>
81+
</argument>
7182
<call method="setConfigCacheFactory">
7283
<argument type="service" id="config_cache_factory" />
7384
</call>
@@ -115,5 +126,10 @@
115126
<service id="Symfony\Bundle\FrameworkBundle\Controller\TemplateController" public="true">
116127
<argument type="service" id="twig" on-invalid="ignore" />
117128
</service>
129+
130+
<service id="Symfony\Component\Routing\Matcher\ExpressionLanguageProvider" public="false">
131+
<tag name="routing.expression_language_provider" />
132+
<argument type="service" id="router" />
133+
</service>
118134
</services>
119135
</container>

‎src/Symfony/Bundle/FrameworkBundle/Routing/Router.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Routing/Router.php
+2-1Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,12 @@ class Router extends BaseRouter implements WarmableInterface, ServiceSubscriberI
3838
/**
3939
* @param mixed $resource The main resource to load
4040
*/
41-
public function __construct(ContainerInterface $container, $resource, array $options = [], RequestContext $context = null, ContainerInterface $parameters = null, LoggerInterface $logger = null, string $defaultLocale = null)
41+
public function __construct(ContainerInterface $container, $resource, array $options = [], RequestContext $context = null, ContainerInterface $parameters = null, LoggerInterface $logger = null, string $defaultLocale = null, array $defaultParameters = [])
4242
{
4343
$this->container = $container;
4444
$this->resource = $resource;
4545
$this->context = $context ?: new RequestContext();
46+
$this->context->addParameters($defaultParameters);
4647
$this->logger = $logger;
4748
$this->setOptions($options);
4849

‎src/Symfony/Component/Routing/CHANGELOG.md

Copy file name to clipboardExpand all lines: src/Symfony/Component/Routing/CHANGELOG.md
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ CHANGELOG
88
* deprecated `RouteCollectionBuilder` in favor of `RoutingConfigurator`.
99
* added "priority" option to annotated routes
1010
* added argument `$priority` to `RouteCollection::add()`
11+
* added `ExpressionLanguageProvider` that provides `env` function.
1112

1213
5.0.0
1314
-----
+59Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Routing\Matcher;
13+
14+
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
15+
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
16+
use Symfony\Component\Routing\RequestContext;
17+
use Symfony\Component\Routing\RouterInterface;
18+
19+
/**
20+
* Defines some ExpressionLanguage functions.
21+
*
22+
* @author Ahmed TAILOULOUTE <ahmed.tailouloute@gmail.com>
23+
*/
24+
class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface
25+
{
26+
/** @var RequestContext */
27+
private $context;
28+
29+
public function __construct(RouterInterface $router)
30+
{
31+
$this->context = $router->getContext();
32+
}
33+
34+
/**
35+
* {@inheritdoc}
36+
*/
37+
public function getFunctions()
38+
{
39+
return [
40+
new ExpressionFunction(
41+
'env',
42+
function ($str, $default = 'null') {
43+
if (false === $this->context->hasParameter('get_env')) {
44+
throw new \LogicException('You cannot use function "env" as no "get_env" is not available.');
45+
}
46+
47+
return sprintf('(($context->getParameter(\'get_env\'))(%s) ?? %s)', $str, $default);
48+
},
49+
function ($arguments, $str, $default = 'null') {
50+
if (false === $this->context->hasParameter('get_env')) {
51+
throw new \LogicException('You cannot use function "env" as no "get_env" is not available.');
52+
}
53+
54+
return ($this->context->getParameter('get_env'))($str) ?? $default;
55+
}
56+
),
57+
];
58+
}
59+
}

‎src/Symfony/Component/Routing/RequestContext.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Routing/RequestContext.php
+15Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Routing;
1313

1414
use Symfony\Component\HttpFoundation\Request;
15+
use Symfony\Component\Routing\Matcher\EnvVarResolverInterface;
1516

1617
/**
1718
* Holds information about the current request.
@@ -269,6 +270,20 @@ public function setParameters(array $parameters)
269270
return $this;
270271
}
271272

273+
/**
274+
* Adds some parameters.
275+
*
276+
* @param array $parameters The parameters
277+
*
278+
* @return $this
279+
*/
280+
public function addParameters(array $parameters)
281+
{
282+
$this->parameters = array_merge($parameters, $this->parameters);
283+
284+
return $this;
285+
}
286+
272287
/**
273288
* Gets a parameter value.
274289
*

‎src/Symfony/Component/Routing/Router.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Routing/Router.php
+2-1Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,13 @@ class Router implements RouterInterface, RequestMatcherInterface
9797
/**
9898
* @param mixed $resource The main resource to load
9999
*/
100-
public function __construct(LoaderInterface $loader, $resource, array $options = [], RequestContext $context = null, LoggerInterface $logger = null, string $defaultLocale = null)
100+
public function __construct(LoaderInterface $loader, $resource, array $options = [], RequestContext $context = null, LoggerInterface $logger = null, string $defaultLocale = null, array $defaultParameters = [])
101101
{
102102
$this->loader = $loader;
103103
$this->resource = $resource;
104104
$this->logger = $logger;
105105
$this->context = $context ?: new RequestContext();
106+
$this->context->addParameters($defaultParameters);
106107
$this->setOptions($options);
107108
$this->defaultLocale = $defaultLocale;
108109
}
+54Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Routing\Tests\Matcher;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
16+
use Symfony\Component\Routing\Matcher\ExpressionLanguageProvider;
17+
18+
class ExpressionLanguageTest extends TestCase
19+
{
20+
private $envVarResolver;
21+
22+
public function setUp()
23+
{
24+
// $this->envVarResolver = $this->getMockBuilder(EnvVarResolverInterface::class)->getMock();
25+
// $this->envVarResolver->method('getEnv')
26+
// ->willReturnMap([
27+
// ['APP_ENV', 'test'],
28+
// ['PHP_VERSION', '7.2'],
29+
// ]);
30+
}
31+
32+
/**
33+
* @dataProvider provider
34+
*/
35+
public function testEnv(string $expression, $expected): void
36+
{
37+
$expressionLanguage = new ExpressionLanguage();
38+
$expressionLanguageProvider = new ExpressionLanguageProvider();
39+
$expressionLanguageProvider->setEnvVarResolver($this->envVarResolver);
40+
$expressionLanguage->registerProvider($expressionLanguageProvider);
41+
42+
$this->assertEquals($expected, $expressionLanguage->evaluate($expression));
43+
}
44+
45+
public function provider(): array
46+
{
47+
return [
48+
['env("APP_ENV")', 'test'],
49+
['env("PHP_VERSION")', '7.2'],
50+
['env("unknown_env_variable")', null],
51+
['env("unknown_env_variable", "default")', 'default'],
52+
];
53+
}
54+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.