@@ -495,7 +495,7 @@ private function getArgumentsAsPhp(\DOMElement $node, string $name, string $file
495
495
$ invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE ;
496
496
}
497
497
498
- switch ($ arg ->getAttribute ('type ' )) {
498
+ switch ($ type = $ arg ->getAttribute ('type ' )) {
499
499
case 'service ' :
500
500
if ('' === $ arg ->getAttribute ('id ' )) {
501
501
throw new InvalidArgumentException (sprintf ('Tag "<%s>" with type="service" has no or empty "id" attribute in "%s". ' , $ name , $ file ));
@@ -517,13 +517,19 @@ private function getArgumentsAsPhp(\DOMElement $node, string $name, string $file
517
517
$ arg = $ this ->getArgumentsAsPhp ($ arg , $ name , $ file );
518
518
$ arguments [$ key ] = new IteratorArgument ($ arg );
519
519
break ;
520
+ case 'closure ' :
520
521
case 'service_closure ' :
521
522
if ('' !== $ arg ->getAttribute ('id ' )) {
522
523
$ arg = new Reference ($ arg ->getAttribute ('id ' ), $ invalidBehavior );
523
524
} else {
524
525
$ arg = $ this ->getArgumentsAsPhp ($ arg , $ name , $ file );
525
526
}
526
- $ arguments [$ key ] = new ServiceClosureArgument ($ arg );
527
+ $ arguments [$ key ] = match ($ type ) {
528
+ 'service_closure ' => new ServiceClosureArgument ($ arg ),
529
+ 'closure ' => (new Definition ('Closure ' ))
530
+ ->setFactory (['Closure ' , 'fromCallable ' ])
531
+ ->addArgument ($ arg ),
532
+ };
527
533
break ;
528
534
case 'service_locator ' :
529
535
$ arg = $ this ->getArgumentsAsPhp ($ arg , $ name , $ file );
@@ -532,7 +538,6 @@ private function getArgumentsAsPhp(\DOMElement $node, string $name, string $file
532
538
case 'tagged ' :
533
539
case 'tagged_iterator ' :
534
540
case 'tagged_locator ' :
535
- $ type = $ arg ->getAttribute ('type ' );
536
541
$ forLocator = 'tagged_locator ' === $ type ;
537
542
538
543
if (!$ arg ->getAttribute ('tag ' )) {
0 commit comments