Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ed94fdc

Browse files
alexndlmfabpot
authored andcommitted
[DependencyInjection] Add env and param parameters for Autowire attribute
1 parent f3a180b commit ed94fdc

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

src/Symfony/Component/DependencyInjection/Attribute/Autowire.php

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,21 @@ class Autowire
2828
/**
2929
* Use only ONE of the following.
3030
*
31-
* @param string|null $value Parameter value (ie "%kernel.project_dir%/some/path")
32-
* @param string|null $service Service ID (ie "some.service")
33-
* @param string|null $expression Expression (ie 'service("some.service").someMethod()')
31+
* @param string|array|null $value Parameter value (ie "%kernel.project_dir%/some/path")
32+
* @param string|null $service Service ID (ie "some.service")
33+
* @param string|null $expression Expression (ie 'service("some.service").someMethod()')
34+
* @param string|null $env Environment variable name (ie 'SOME_ENV_VARIABLE')
35+
* @param string|null $param Parameter name (ie 'some.parameter.name')
3436
*/
3537
public function __construct(
3638
string|array $value = null,
3739
string $service = null,
3840
string $expression = null,
41+
string $env = null,
42+
string $param = null,
3943
) {
40-
if (!($service xor $expression xor null !== $value)) {
41-
throw new LogicException('#[Autowire] attribute must declare exactly one of $service, $expression, or $value.');
44+
if (!(null !== $value xor null !== $service xor null !== $expression xor null !== $env xor null !== $param)) {
45+
throw new LogicException('#[Autowire] attribute must declare exactly one of $service, $expression, $env, $param or $value.');
4246
}
4347

4448
if (\is_string($value) && str_starts_with($value, '@')) {
@@ -52,6 +56,8 @@ public function __construct(
5256
$this->value = match (true) {
5357
null !== $service => new Reference($service),
5458
null !== $expression => class_exists(Expression::class) ? new Expression($expression) : throw new LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed. Try running "composer require symfony/expression-language".'),
59+
null !== $env => "%env($env)%",
60+
null !== $param => "%$param%",
5561
null !== $value => $value,
5662
};
5763
}

src/Symfony/Component/DependencyInjection/Tests/Attribute/AutowireTest.php

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,14 @@
1919

2020
class AutowireTest extends TestCase
2121
{
22-
public function testCanOnlySetOneParameter()
22+
/**
23+
* @dataProvider provideMultipleParameters
24+
*/
25+
public function testCanOnlySetOneParameter(array $parameters)
2326
{
2427
$this->expectException(LogicException::class);
2528

26-
new Autowire(service: 'id', expression: 'expr');
29+
new Autowire(...$parameters);
2730
}
2831

2932
public function testMustSetOneParameter()
@@ -57,4 +60,26 @@ public function testCanUseValueWithAtAndEqualSign()
5760
{
5861
$this->assertInstanceOf(Expression::class, (new Autowire(value: '@=service'))->value);
5962
}
63+
64+
public function testCanUseEnv()
65+
{
66+
$this->assertSame('%env(SOME_ENV_VAR)%', (new Autowire(env: 'SOME_ENV_VAR'))->value);
67+
}
68+
69+
public function testCanUseParam()
70+
{
71+
$this->assertSame('%some.param%', (new Autowire(param: 'some.param'))->value);
72+
}
73+
74+
/**
75+
* @see testCanOnlySetOneParameter
76+
*/
77+
private function provideMultipleParameters(): iterable
78+
{
79+
yield [['service' => 'id', 'expression' => 'expr']];
80+
81+
yield [['env' => 'ENV', 'param' => 'param']];
82+
83+
yield [['value' => 'some-value', 'expression' => 'expr']];
84+
}
6085
}

0 commit comments

Comments
 (0)