13
13
14
14
use PHPUnit \Framework \TestCase ;
15
15
use Symfony \Component \DependencyInjection \Argument \ServiceClosureArgument ;
16
+ use Symfony \Component \DependencyInjection \Compiler \ResolveChildDefinitionsPass ;
16
17
use Symfony \Component \DependencyInjection \ContainerBuilder ;
17
18
use Symfony \Component \DependencyInjection \Reference ;
18
19
use Symfony \Component \DependencyInjection \ServiceLocator ;
@@ -312,14 +313,42 @@ public function testRegistersMiddlewareFromServices()
312
313
$ container = $ this ->getContainerBuilder ();
313
314
$ container ->register ($ fooBusId = 'messenger.bus.foo ' , MessageBusInterface::class)->setArgument (0 , array ())->addTag ('messenger.bus ' );
314
315
$ container ->register ('messenger.middleware.allow_no_handler ' , AllowNoHandlerMiddleware::class)->setAbstract (true );
316
+ $ container ->register ('middleware_with_factory ' , UselessMiddleware::class)->addArgument ('some_default ' )->setAbstract (true );
317
+ $ container ->register ('middleware_with_factory_using_default ' , UselessMiddleware::class)->addArgument ('some_default ' )->setAbstract (true );
315
318
$ container ->register (UselessMiddleware::class, UselessMiddleware::class);
316
319
317
- $ container ->setParameter ($ middlewareParameter = $ fooBusId .'.middleware ' , array (UselessMiddleware::class, 'allow_no_handler ' ));
320
+ $ container ->setParameter ($ middlewareParameter = $ fooBusId .'.middleware ' , array (
321
+ array ('id ' => UselessMiddleware::class),
322
+ array ('id ' => 'middleware_with_factory ' , 'arguments ' => array ('foo ' , 'bar ' )),
323
+ array ('id ' => 'middleware_with_factory_using_default ' ),
324
+ array ('id ' => 'allow_no_handler ' ),
325
+ ));
318
326
319
327
(new MessengerPass ())->process ($ container );
328
+ (new ResolveChildDefinitionsPass ())->process ($ container );
320
329
321
330
$ this ->assertTrue ($ container ->hasDefinition ($ childMiddlewareId = $ fooBusId .'.middleware.allow_no_handler ' ));
322
- $ this ->assertEquals (array (new Reference (UselessMiddleware::class), new Reference ($ childMiddlewareId )), $ container ->getDefinition ($ fooBusId )->getArgument (0 ));
331
+
332
+ $ this ->assertTrue ($ container ->hasDefinition ($ factoryChildMiddlewareId = $ fooBusId .'.middleware.middleware_with_factory ' ));
333
+ $ this ->assertEquals (
334
+ array ('foo ' , 'bar ' ),
335
+ $ container ->getDefinition ($ factoryChildMiddlewareId )->getArguments (),
336
+ 'parent default argument is overridden, and next ones appended '
337
+ );
338
+
339
+ $ this ->assertTrue ($ container ->hasDefinition ($ factoryWithDefaultChildMiddlewareId = $ fooBusId .'.middleware.middleware_with_factory_using_default ' ));
340
+ $ this ->assertEquals (
341
+ array ('some_default ' ),
342
+ $ container ->getDefinition ($ factoryWithDefaultChildMiddlewareId )->getArguments (),
343
+ 'parent default argument is used '
344
+ );
345
+
346
+ $ this ->assertEquals (array (
347
+ new Reference (UselessMiddleware::class),
348
+ new Reference ($ factoryChildMiddlewareId ),
349
+ new Reference ($ factoryWithDefaultChildMiddlewareId ),
350
+ new Reference ($ childMiddlewareId ),
351
+ ), $ container ->getDefinition ($ fooBusId )->getArgument (0 ));
323
352
$ this ->assertFalse ($ container ->hasParameter ($ middlewareParameter ));
324
353
}
325
354
@@ -331,7 +360,25 @@ public function testCannotRegistersAnUndefinedMiddleware()
331
360
{
332
361
$ container = $ this ->getContainerBuilder ();
333
362
$ container ->register ($ fooBusId = 'messenger.bus.foo ' , MessageBusInterface::class)->setArgument (0 , array ())->addTag ('messenger.bus ' );
334
- $ container ->setParameter ($ middlewareParameter = $ fooBusId .'.middleware ' , array ('not_defined_middleware ' ));
363
+ $ container ->setParameter ($ middlewareParameter = $ fooBusId .'.middleware ' , array (
364
+ array ('id ' => 'not_defined_middleware ' , 'arguments ' => array ()),
365
+ ));
366
+
367
+ (new MessengerPass ())->process ($ container );
368
+ }
369
+
370
+ /**
371
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
372
+ * @expectedExceptionMessage Invalid middleware factory "not_an_abstract_definition": a middleware factory must be an abstract definition.
373
+ */
374
+ public function testMiddlewareFactoryDefinitionMustBeAbstract ()
375
+ {
376
+ $ container = $ this ->getContainerBuilder ();
377
+ $ container ->register ('not_an_abstract_definition ' , UselessMiddleware::class);
378
+ $ container ->register ($ fooBusId = 'messenger.bus.foo ' , MessageBusInterface::class)->setArgument (0 , array ())->addTag ('messenger.bus ' , array ('name ' => 'foo ' ));
379
+ $ container ->setParameter ($ middlewareParameter = $ fooBusId .'.middleware ' , array (
380
+ array ('id ' => 'not_an_abstract_definition ' , 'arguments ' => array ('foo ' )),
381
+ ));
335
382
336
383
(new MessengerPass ())->process ($ container );
337
384
}
0 commit comments