Movatterモバイル変換


[0]ホーム

URL:


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

Sign up
Appearance settings

Commitfee84f7

Browse files
committed
add SubscribedService attribute, deprecate current ServiceSubscriberTrait usage
1 parentc1c973c commitfee84f7

File tree

9 files changed

+316
-11
lines changed

9 files changed

+316
-11
lines changed

‎src/Symfony/Component/DependencyInjection/Tests/Compiler/RegisterServiceSubscribersPassTest.php‎

Lines changed: 140 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,16 @@
2424
useSymfony\Component\DependencyInjection\Reference;
2525
useSymfony\Component\DependencyInjection\ServiceLocator;
2626
useSymfony\Component\DependencyInjection\Tests\Fixtures\CustomDefinition;
27+
useSymfony\Component\DependencyInjection\Tests\Fixtures\LegacyTestServiceSubscriberChild;
28+
useSymfony\Component\DependencyInjection\Tests\Fixtures\LegacyTestServiceSubscriberParent;
2729
useSymfony\Component\DependencyInjection\Tests\Fixtures\TestDefinition1;
2830
useSymfony\Component\DependencyInjection\Tests\Fixtures\TestDefinition2;
2931
useSymfony\Component\DependencyInjection\Tests\Fixtures\TestDefinition3;
3032
useSymfony\Component\DependencyInjection\Tests\Fixtures\TestServiceSubscriber;
3133
useSymfony\Component\DependencyInjection\Tests\Fixtures\TestServiceSubscriberChild;
3234
useSymfony\Component\DependencyInjection\Tests\Fixtures\TestServiceSubscriberParent;
3335
useSymfony\Component\DependencyInjection\TypedReference;
36+
useSymfony\Contracts\Service\Attribute\SubscribedService;
3437
useSymfony\Contracts\Service\ServiceSubscriberInterface;
3538
useSymfony\Contracts\Service\ServiceSubscriberTrait;
3639

@@ -143,11 +146,14 @@ public function testExtraServiceSubscriber()
143146
$container->compile();
144147
}
145148

149+
/**
150+
* @group legacy
151+
*/
146152
publicfunctiontestServiceSubscriberTrait()
147153
{
148154
$container =newContainerBuilder();
149155

150-
$container->register('foo',TestServiceSubscriberChild::class)
156+
$container->register('foo',LegacyTestServiceSubscriberChild::class)
151157
->addMethodCall('setContainer', [newReference(PsrContainerInterface::class)])
152158
->addTag('container.service_subscriber')
153159
;
@@ -159,15 +165,18 @@ public function testServiceSubscriberTrait()
159165
$locator =$container->getDefinition((string)$foo->getMethodCalls()[0][1][0]);
160166

161167
$expected = [
162-
TestServiceSubscriberChild::class.'::invalidDefinition' =>newServiceClosureArgument(newTypedReference('Symfony\Component\DependencyInjection\Tests\Fixtures\InvalidDefinition','Symfony\Component\DependencyInjection\Tests\Fixtures\InvalidDefinition', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
163-
TestServiceSubscriberChild::class.'::testDefinition2' =>newServiceClosureArgument(newTypedReference(TestDefinition2::class, TestDefinition2::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
164-
TestServiceSubscriberChild::class.'::testDefinition3' =>newServiceClosureArgument(newTypedReference(TestDefinition3::class, TestDefinition3::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
165-
TestServiceSubscriberParent::class.'::testDefinition1' =>newServiceClosureArgument(newTypedReference(TestDefinition1::class, TestDefinition1::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
168+
LegacyTestServiceSubscriberChild::class.'::invalidDefinition' =>newServiceClosureArgument(newTypedReference('Symfony\Component\DependencyInjection\Tests\Fixtures\InvalidDefinition','Symfony\Component\DependencyInjection\Tests\Fixtures\InvalidDefinition', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
169+
LegacyTestServiceSubscriberChild::class.'::testDefinition2' =>newServiceClosureArgument(newTypedReference(TestDefinition2::class, TestDefinition2::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
170+
LegacyTestServiceSubscriberChild::class.'::testDefinition3' =>newServiceClosureArgument(newTypedReference(TestDefinition3::class, TestDefinition3::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
171+
LegacyTestServiceSubscriberParent::class.'::testDefinition1' =>newServiceClosureArgument(newTypedReference(TestDefinition1::class, TestDefinition1::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
166172
];
167173

168174
$this->assertEquals($expected,$container->getDefinition((string)$locator->getFactory()[0])->getArgument(0));
169175
}
170176

177+
/**
178+
* @group legacy
179+
*/
171180
publicfunctiontestServiceSubscriberTraitWithGetter()
172181
{
173182
$container =newContainerBuilder();
@@ -195,6 +204,132 @@ public function getFoo(): \stdClass
195204
$this->assertEquals($expected,$container->getDefinition((string)$locator->getFactory()[0])->getArgument(0));
196205
}
197206

207+
/**
208+
* @requires PHP 8
209+
*/
210+
publicfunctiontestServiceSubscriberTraitWithSubscribedServiceAttribute()
211+
{
212+
$container =newContainerBuilder();
213+
214+
$container->register('foo', TestServiceSubscriberChild::class)
215+
->addMethodCall('setContainer', [newReference(PsrContainerInterface::class)])
216+
->addTag('container.service_subscriber')
217+
;
218+
219+
(newRegisterServiceSubscribersPass())->process($container);
220+
(newResolveServiceSubscribersPass())->process($container);
221+
222+
$foo =$container->getDefinition('foo');
223+
$locator =$container->getDefinition((string)$foo->getMethodCalls()[0][1][0]);
224+
225+
$expected = [
226+
TestServiceSubscriberChild::class.'::invalidDefinition' =>newServiceClosureArgument(newTypedReference('Symfony\Component\DependencyInjection\Tests\Fixtures\InvalidDefinition','Symfony\Component\DependencyInjection\Tests\Fixtures\InvalidDefinition', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
227+
TestServiceSubscriberChild::class.'::testDefinition2' =>newServiceClosureArgument(newTypedReference(TestDefinition2::class, TestDefinition2::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
228+
TestServiceSubscriberChild::class.'::testDefinition4' =>newServiceClosureArgument(newTypedReference(TestDefinition3::class, TestDefinition3::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
229+
TestServiceSubscriberParent::class.'::testDefinition1' =>newServiceClosureArgument(newTypedReference(TestDefinition1::class, TestDefinition1::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
230+
'custom_name' =>newServiceClosureArgument(newTypedReference(TestDefinition3::class, TestDefinition3::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE,'custom_name')),
231+
];
232+
233+
$this->assertEquals($expected,$container->getDefinition((string)$locator->getFactory()[0])->getArgument(0));
234+
}
235+
236+
/**
237+
* @requires PHP 8
238+
*/
239+
publicfunctiontestServiceSubscriberTraitWithSubscribedServiceAttributeOnStaticMethod()
240+
{
241+
$subscriber =newclass()implements ServiceSubscriberInterface {
242+
use ServiceSubscriberTrait;
243+
244+
#[SubscribedService]
245+
publicstaticfunctionmethod():TestDefinition1
246+
{
247+
}
248+
};
249+
250+
$this->expectException(\LogicException::class);
251+
252+
$subscriber::getSubscribedServices();
253+
}
254+
255+
/**
256+
* @requires PHP 8
257+
*/
258+
publicfunctiontestServiceSubscriberTraitWithSubscribedServiceAttributeOnMethodWithRequiredParameters()
259+
{
260+
$subscriber =newclass()implements ServiceSubscriberInterface {
261+
use ServiceSubscriberTrait;
262+
263+
#[SubscribedService]
264+
publicfunctionmethod($param1,$param2 =null):TestDefinition1
265+
{
266+
}
267+
};
268+
269+
$this->expectException(\LogicException::class);
270+
271+
$subscriber::getSubscribedServices();
272+
}
273+
274+
/**
275+
* @requires PHP 8
276+
*/
277+
publicfunctiontestServiceSubscriberTraitWithSubscribedServiceAttributeOnMethodMissingReturnType()
278+
{
279+
$subscriber =newclass()implements ServiceSubscriberInterface {
280+
use ServiceSubscriberTrait;
281+
282+
#[SubscribedService]
283+
publicfunctionmethod()
284+
{
285+
}
286+
};
287+
288+
$this->expectException(\LogicException::class);
289+
290+
$subscriber::getSubscribedServices();
291+
}
292+
293+
/**
294+
* @requires PHP 8
295+
*/
296+
publicfunctiontestServiceSubscriberTraitWithSubscribedServiceAttributeOnMethodWithBuiltInReturnType()
297+
{
298+
$subscriber =newclass()implements ServiceSubscriberInterface {
299+
use ServiceSubscriberTrait;
300+
301+
#[SubscribedService]
302+
publicfunctionmethod():string
303+
{
304+
}
305+
};
306+
307+
$this->expectException(\LogicException::class);
308+
309+
$subscriber::getSubscribedServices();
310+
}
311+
312+
/**
313+
* @requires PHP 8
314+
*/
315+
publicfunctiontestServiceSubscriberTraitWithSubscribedServiceAttributeOnMethodWithUnionReturnType()
316+
{
317+
eval('
318+
$subscriber = new class() implements Symfony\Contracts\Service\ServiceSubscriberInterface {
319+
use Symfony\Contracts\Service\ServiceSubscriberTrait;
320+
321+
#[Symfony\Contracts\Service\Attribute\SubscribedService]
322+
public function method(): TestDefinition1|TestDefinition2
323+
{
324+
}
325+
};
326+
');
327+
328+
$this->expectException(\LogicException::class);
329+
330+
$subscriber::getSubscribedServices();
331+
}
332+
198333
publicfunctiontestServiceSubscriberWithSemanticId()
199334
{
200335
$container =newContainerBuilder();
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespaceSymfony\Component\DependencyInjection\Tests\Fixtures;
4+
5+
useSymfony\Contracts\Service\ServiceSubscriberTrait;
6+
7+
class LegacyTestServiceSubscriberChildextends LegacyTestServiceSubscriberParent
8+
{
9+
use ServiceSubscriberTrait;
10+
use LegacyTestServiceSubscriberTrait;
11+
12+
privatefunctiontestDefinition2():TestDefinition2
13+
{
14+
return$this->container->get(__METHOD__);
15+
}
16+
17+
privatefunctioninvalidDefinition():InvalidDefinition
18+
{
19+
return$this->container->get(__METHOD__);
20+
}
21+
22+
privatefunctionprivateFunction1():string
23+
{
24+
}
25+
26+
privatefunctionprivateFunction2():string
27+
{
28+
}
29+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespaceSymfony\Component\DependencyInjection\Tests\Fixtures;
4+
5+
useSymfony\Contracts\Service\ServiceSubscriberInterface;
6+
useSymfony\Contracts\Service\ServiceSubscriberTrait;
7+
8+
class LegacyTestServiceSubscriberParentimplements ServiceSubscriberInterface
9+
{
10+
use ServiceSubscriberTrait;
11+
12+
privatefunctiontestDefinition1():TestDefinition1
13+
{
14+
return$this->container->get(__METHOD__);
15+
}
16+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespaceSymfony\Component\DependencyInjection\Tests\Fixtures;
4+
5+
trait LegacyTestServiceSubscriberTrait
6+
{
7+
privatefunctiontestDefinition3():TestDefinition3
8+
{
9+
return$this->container->get(__CLASS__.'::'.__FUNCTION__);
10+
}
11+
}

‎src/Symfony/Component/DependencyInjection/Tests/Fixtures/TestServiceSubscriberChild.php‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,27 @@
22

33
namespaceSymfony\Component\DependencyInjection\Tests\Fixtures;
44

5+
useSymfony\Contracts\Service\Attribute\SubscribedService;
56
useSymfony\Contracts\Service\ServiceSubscriberTrait;
67

78
class TestServiceSubscriberChildextends TestServiceSubscriberParent
89
{
910
use ServiceSubscriberTrait;
1011
use TestServiceSubscriberTrait;
1112

13+
#[SubscribedService]
1214
privatefunctiontestDefinition2():TestDefinition2
1315
{
1416
return$this->container->get(__METHOD__);
1517
}
1618

19+
#[SubscribedService('custom_name')]
20+
privatefunctiontestDefinition3():TestDefinition3
21+
{
22+
return$this->container->get('custom_name');
23+
}
24+
25+
#[SubscribedService]
1726
privatefunctioninvalidDefinition():InvalidDefinition
1827
{
1928
return$this->container->get(__METHOD__);
@@ -26,4 +35,8 @@ private function privateFunction1(): string
2635
privatefunctionprivateFunction2():string
2736
{
2837
}
38+
39+
privatefunctionprivateFunction3():AnotherClass
40+
{
41+
}
2942
}

‎src/Symfony/Component/DependencyInjection/Tests/Fixtures/TestServiceSubscriberParent.php‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,19 @@
22

33
namespaceSymfony\Component\DependencyInjection\Tests\Fixtures;
44

5+
useSymfony\Contracts\Service\Attribute\SubscribedService;
56
useSymfony\Contracts\Service\ServiceSubscriberInterface;
67
useSymfony\Contracts\Service\ServiceSubscriberTrait;
78

89
class TestServiceSubscriberParentimplements ServiceSubscriberInterface
910
{
1011
use ServiceSubscriberTrait;
1112

13+
publicfunctionpublicFunction1():SomeClass
14+
{
15+
}
16+
17+
#[SubscribedService]
1218
privatefunctiontestDefinition1():TestDefinition1
1319
{
1420
return$this->container->get(__METHOD__);

‎src/Symfony/Component/DependencyInjection/Tests/Fixtures/TestServiceSubscriberTrait.php‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,16 @@
22

33
namespaceSymfony\Component\DependencyInjection\Tests\Fixtures;
44

5+
useSymfony\Contracts\Service\Attribute\SubscribedService;
6+
57
trait TestServiceSubscriberTrait
68
{
7-
privatefunctiontestDefinition3():TestDefinition3
9+
protectedfunctionprotectedFunction1():SomeClass
10+
{
11+
}
12+
13+
#[SubscribedService]
14+
privatefunctiontestDefinition4():TestDefinition3
815
{
916
return$this->container->get(__CLASS__.'::'.__FUNCTION__);
1017
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
namespaceSymfony\Contracts\Service\Attribute;
13+
14+
useSymfony\Contracts\Service\ServiceSubscriberTrait;
15+
16+
/**
17+
* Use with {@see ServiceSubscriberTrait} to mark a method's return type
18+
* as a subscribed service.
19+
*
20+
* @author Kevin Bond <kevinbond@gmail.com>
21+
*/
22+
#[\Attribute(\Attribute::TARGET_METHOD)]
23+
finalclass SubscribedService
24+
{
25+
public ?string$key;
26+
27+
/**
28+
* @param string|null $key The key to use for the service
29+
* If null, use "ClassName::methodName"
30+
*/
31+
publicfunction__construct(string$key =null)
32+
{
33+
$this->key =$key;
34+
}
35+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp