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

Commited131b4

Browse files
author
Anthony MARTIN
committed
[DI] change name to tag + add XMl support + adding yaml/xml tests
1 parent453b01a commited131b4

File tree

16 files changed

+218
-6
lines changed

16 files changed

+218
-6
lines changed

‎src/Symfony/Component/DependencyInjection/Argument/TaggedIteratorArgument.php‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ class TaggedIteratorArgument extends IteratorArgument
2222
private$indexAttribute;
2323
private$defaultIndexMethod;
2424

25+
/**
26+
* TaggedIteratorArgument constructor.
27+
*
28+
* @param string $tag tag name
29+
* @param string|null $indexAttribute an attribute name on the tag to get the index name
30+
* @param string|null $defaultIndexMethod a public static method on tagged services to get theirs index names if no attribute corresponding to the $indexAttribute is set on the tag
31+
*/
2532
publicfunction__construct(string$tag,string$indexAttribute =null,string$defaultIndexMethod =null)
2633
{
2734
parent::__construct([]);

‎src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,14 @@ private function convertParameters(array $parameters, $type, \DOMElement $parent
286286
}elseif ($valueinstanceof TaggedIteratorArgument) {
287287
$element->setAttribute('type','tagged');
288288
$element->setAttribute('tag',$value->getTag());
289+
290+
if (null !==$value->getIndexAttribute()) {
291+
$element->setAttribute('index-by',$value->getIndexAttribute());
292+
}
293+
294+
if (null !==$value->getDefaultIndexMethod()) {
295+
$element->setAttribute('default-index-method',$value->getDefaultIndexMethod());
296+
}
289297
}elseif ($valueinstanceof IteratorArgument) {
290298
$element->setAttribute('type','iterator');
291299
$this->convertParameters($value->getValues(),$type,$element,'key');

‎src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,19 @@ private function dumpValue($value)
233233
}
234234
if ($valueinstanceof ArgumentInterface) {
235235
if ($valueinstanceof TaggedIteratorArgument) {
236+
if (null !==$value->getIndexAttribute()) {
237+
$taggedValueContent = [
238+
'tag' =>$value->getTag(),
239+
'index_by' =>$value->getIndexAttribute(),
240+
];
241+
242+
if (null !==$value->getDefaultIndexMethod()) {
243+
$taggedValueContent['default_index_method'] =$value->getDefaultIndexMethod();
244+
}
245+
246+
returnnewTaggedValue('tagged',$taggedValueContent);
247+
}
248+
236249
returnnewTaggedValue('tagged',$value->getTag());
237250
}
238251
if ($valueinstanceof IteratorArgument) {

‎src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,8 @@ private function getArgumentsAsPhp(\DOMElement $node, $name, $file, $lowercase =
537537
if (!$arg->getAttribute('tag')) {
538538
thrownewInvalidArgumentException(sprintf('Tag "<%s>" with type="tagged" has no or empty "tag" attribute in "%s".',$name,$file));
539539
}
540-
$arguments[$key] =newTaggedIteratorArgument($arg->getAttribute('tag'));
540+
541+
$arguments[$key] =newTaggedIteratorArgument($arg->getAttribute('tag'),$arg->getAttribute('index-by') ?:null,$arg->getAttribute('default-index-method') ?:null);
541542
break;
542543
case'binary':
543544
if (false ===$value =base64_decode($arg->nodeValue)) {

‎src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -713,14 +713,16 @@ private function resolveServices($value, $file, $isParameter = false)
713713
if (\is_string($argument) &&$argument) {
714714
returnnewTaggedIteratorArgument($argument);
715715
}
716-
if (\is_array($argument) &&isset($argument['name']) &&$argument['name']) {
717-
if (array_diff(array_keys($argument), ['name','index_by','default_index_method'])) {
718-
thrownewInvalidArgumentException('"!tagged" tag contains unsupported keys. Supported are: "name, index_by, default_index_method".');
716+
717+
if (\is_array($argument) &&isset($argument['tag']) &&$argument['tag']) {
718+
if ($diff =array_diff(array_keys($argument), ['tag','index_by','default_index_method'])) {
719+
thrownewInvalidArgumentException(sprintf('"!tagged" tag contains unsupported key "%s"; supported ones are "tag", "index_by" and "default_index_method".',implode(',',$diff)));
719720
}
720721

721-
returnnewTaggedIteratorArgument($argument['name'],$argument['index_by'] ??null,$argument['default_index_method'] ??null);
722+
returnnewTaggedIteratorArgument($argument['tag'],$argument['index_by'] ??null,$argument['default_index_method'] ??null);
722723
}
723-
thrownewInvalidArgumentException(sprintf('"!tagged" tag only accepts a non empty string or an array with a key "name" in "%s".',$file));
724+
725+
thrownewInvalidArgumentException(sprintf('"!tagged" tags only accept a non empty string or an array with a key "tag" in "%s".',$file));
724726
}
725727
if ('service' ===$value->getTag()) {
726728
if ($isParameter) {

‎src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@
234234
<xsd:attributename="index"type="xsd:integer" />
235235
<xsd:attributename="on-invalid"type="invalid_sequence" />
236236
<xsd:attributename="tag"type="xsd:string" />
237+
<xsd:attributename="index-by"type="xsd:string" />
238+
<xsd:attributename="default-index-method"type="xsd:string" />
237239
</xsd:complexType>
238240

239241
<xsd:complexTypename="call">

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@
1414
usePHPUnit\Framework\TestCase;
1515
useSymfony\Component\Config\FileLocator;
1616
useSymfony\Component\DependencyInjection\Alias;
17+
useSymfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
1718
useSymfony\Component\DependencyInjection\ContainerBuilder;
1819
useSymfony\Component\DependencyInjection\Loader\YamlFileLoader;
1920
useSymfony\Component\DependencyInjection\Reference;
2021
useSymfony\Component\DependencyInjection\ServiceSubscriberInterface;
22+
useSymfony\Component\DependencyInjection\Tests\Fixtures\BarTagClass;
23+
useSymfony\Component\DependencyInjection\Tests\Fixtures\FooBarTaggedClass;
24+
useSymfony\Component\DependencyInjection\Tests\Fixtures\FooTagClass;
2125

2226
/**
2327
* This class tests the integration of the different compiler passes.
@@ -234,6 +238,54 @@ public function getYamlCompileTests()
234238
$container,
235239
];
236240
}
241+
242+
publicfunctiontestTaggedServiceWithIndexAttribute()
243+
{
244+
$container =newContainerBuilder();
245+
$container->register(BarTagClass::class, BarTagClass::class)
246+
->setPublic(true)
247+
->addTag('foo_bar', ['foo' =>'bar'])
248+
;
249+
$container->register(FooTagClass::class, FooTagClass::class)
250+
->setPublic(true)
251+
->addTag('foo_bar')
252+
;
253+
$container->register(FooBarTaggedClass::class, FooBarTaggedClass::class)
254+
->addArgument(newTaggedIteratorArgument('foo_bar','foo'))
255+
->setPublic(true)
256+
;
257+
258+
$container->compile();
259+
260+
$s =$container->get(FooBarTaggedClass::class);
261+
262+
$param =iterator_to_array($s->getParam()->getIterator());
263+
$this->assertSame(['bar' =>$container->get(BarTagClass::class),'foo_tag_class' =>$container->get(FooTagClass::class)],$param);
264+
}
265+
266+
publicfunctiontestTaggedServiceWithIndexAttributeAndDefaultMethod()
267+
{
268+
$container =newContainerBuilder();
269+
$container->register(BarTagClass::class, BarTagClass::class)
270+
->setPublic(true)
271+
->addTag('foo_bar')
272+
;
273+
$container->register(FooTagClass::class, FooTagClass::class)
274+
->setPublic(true)
275+
->addTag('foo_bar', ['foo' =>'foo'])
276+
;
277+
$container->register(FooBarTaggedClass::class, FooBarTaggedClass::class)
278+
->addArgument(newTaggedIteratorArgument('foo_bar','foo','getFooBar'))
279+
->setPublic(true)
280+
;
281+
282+
$container->compile();
283+
284+
$s =$container->get(FooBarTaggedClass::class);
285+
286+
$param =iterator_to_array($s->getParam()->getIterator());
287+
$this->assertSame(['bar_tab_class_with_defaultmethod' =>$container->get(BarTagClass::class),'foo' =>$container->get(FooTagClass::class)],$param);
288+
}
237289
}
238290

239291
class ServiceSubscriberStubimplements ServiceSubscriberInterface

‎src/Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
usePHPUnit\Framework\TestCase;
1515
useSymfony\Component\Config\FileLocator;
16+
useSymfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
1617
useSymfony\Component\DependencyInjection\ContainerBuilder;
1718
useSymfony\Component\DependencyInjection\ContainerInterface;
1819
useSymfony\Component\DependencyInjection\Dumper\XmlDumper;
@@ -200,6 +201,19 @@ public function testDumpLoad()
200201
$this->assertStringEqualsFile(self::$fixturesPath.'/xml/services_dump_load.xml',$dumper->dump());
201202
}
202203

204+
publicfunctiontestTaggedArgument()
205+
{
206+
$container =newContainerBuilder();
207+
$container->register('foo','Foo')->addTag('foo_tag');
208+
$container->register('foo_tagged_iterator','Bar')
209+
->setPublic(true)
210+
->addArgument(newTaggedIteratorArgument('foo_tag','barfoo','foobar'))
211+
;
212+
213+
$dumper =newXmlDumper($container);
214+
$this->assertStringEqualsFile(self::$fixturesPath.'/xml/services_with_tagged_arguments.xml',$dumper->dump());
215+
}
216+
203217
publicfunctiontestDumpAbstractServices()
204218
{
205219
$container =includeself::$fixturesPath.'/containers/container_abstract.php';

‎src/Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
usePHPUnit\Framework\TestCase;
1515
useSymfony\Component\Config\FileLocator;
16+
useSymfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
1617
useSymfony\Component\DependencyInjection\ContainerBuilder;
1718
useSymfony\Component\DependencyInjection\ContainerInterface;
1819
useSymfony\Component\DependencyInjection\Definition;
@@ -95,6 +96,16 @@ public function testInlineServices()
9596
$this->assertStringEqualsFile(self::$fixturesPath.'/yaml/services_inline.yml',$dumper->dump());
9697
}
9798

99+
publicfunctiontestTaggedArgument()
100+
{
101+
$container =newContainerBuilder();
102+
$container->register('foo_service','Foo')->addTag('foo');
103+
$container->register('foo_service_tagged','Bar')->addArgument(newTaggedIteratorArgument('foo','barfoo','foobar'));
104+
105+
$dumper =newYamlDumper($container);
106+
$this->assertStringEqualsFile(self::$fixturesPath.'/yaml/services_with_tagged_argument.yml',$dumper->dump());
107+
}
108+
98109
privatefunctionassertEqualYamlStructure($expected,$yaml,$message ='')
99110
{
100111
$parser =newParser();
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+
class BarTagClass
6+
{
7+
publicstaticfunctiongetDefaultFooName()
8+
{
9+
return'bar_tag_class';
10+
}
11+
12+
publicstaticfunctiongetFooBar()
13+
{
14+
return'bar_tab_class_with_defaultmethod';
15+
}
16+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp