8000 feature #20260 [DependencyInjection] Support autowiring for EventDisp… · symfony/symfony@4033b60 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4033b60

Browse files
committed
feature #20260 [DependencyInjection] Support autowiring for EventDispatcher/EventDispatcherInterface (chalasr)
This PR was merged into the 3.3-dev branch. Discussion ---------- [DependencyInjection] Support autowiring for EventDispatcher/EventDispatcherInterface | Q | A | | --- | --- | | Branch? | master | | Bug fix? | no | | New feature? | yes | | BC breaks? | no | | Deprecations? | no | | Tests pass? | yes | | Fixed tickets | n/a | | License | MIT | | Doc PR | n/a | As it is a very common dependency. Currently it gives: > [Symfony\Component\DependencyInjection\Exception\RuntimeException] > Unable to autowire argument of type "Symfony\Component\EventDispatcher\EventDispatcherInterface" for the service "dummy". Multiple services exist for this interface (debug.event_dispatcher, debug.event_dispatcher.parent). After this, the `TraceableEventDispatcher` will be injected in dev and the `ContainerAwareEventDispatcher` in prod, as when injecting `@event_dispatcher` explicitly. ping @weaverryan IMHO this could be treated as a an enhancement for the autowiring feature and be part of 3.2. Commits ------- 5fd4733 Support autowiring for EventDispatcher/EventDispatcherInterface
2 parents 9f475f8 + 5fd4733 commit 4033b60

File tree

5 files changed

+30
-9
lines changed

5 files changed

+30
-9
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -479,12 +479,6 @@ private function registerDebugConfiguration(array $config, ContainerBuilder $con
479479

480480
if ($debug) {
481481
$loader->load('debug.xml');
482-
483-
// replace the regular event_dispatcher service with the debug one
484-
$definition = $container->findDefinition('event_dispatcher');
485-
$definition->setPublic(false);
486-
$container->setDefinition('debug.event_dispatcher.parent', $definition);
487-
$container->setAlias('event_dispatcher', 'debug.event_dispatcher');
488482
}
489483

490484
$definition = $container->findDefinition('debug.debug_handlers_listener');

src/Symfony/Bundle/FrameworkBundle/Resources/config/debug.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
</parameters>
1010

1111
<services>
12-
<service id="debug.event_dispatcher" class="Symfony\Component\HttpKernel\Debug\TraceableEventDispatcher">
12+
<service id="debug.event_dispatcher" class="Symfony\Component\HttpKernel\Debug\TraceableEventDispatcher" decorates="event_dispatcher">
1313
<tag name="monolog.logger" channel="event" />
14-
<argument type="service" id="debug.event_dispatcher.parent" />
14+
<argument type="service" id="debug.event_dispatcher.inner" />
1515
<argument type="service" id="debug.stopwatch" />
1616
<argument type="service" id="logger" on-invalid="null" />
1717
</service>

src/Symfony/Bundle/FrameworkBundle/Resources/config/services.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
<services>
88
<service id="event_dispatcher" class="Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher">
99
<argument type="service" id="service_container" />
10+
<autowiring-type>Symfony\Component\EventDispatcher\EventDispatcherInterface</autowiring-type>
11+
<autowiring-type>Symfony\Component\EventDispatcher\EventDispatcher</autowiring-type>
1012
</service>
1113

1214
<service id="http_kernel" class="Symfony\Component\HttpKernel\HttpKernel">

src/Symfony/Bundle/FrameworkBundle/Tests/Functional/AutowiringTypesTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
use Doctrine\Common\Annotations\AnnotationReader;
1515
use Doctrine\Common\Annotations\CachedReader;
1616
use Symfony\Component\Templating\EngineInterface as ComponentEngineInterface;
17+
use Symfony\Component\HttpKernel\Debug\TraceableEventDispatcher;
18+
use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher;
1719
use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface as FrameworkBundleEngineInterface;
1820

1921
class AutowiringTypesTest extends WebTestCase
@@ -46,6 +48,21 @@ public function testTemplatingAutowiring()
4648
$this->assertInstanceOf(ComponentEngineInterface::class, $autowiredServices->getEngine());
4749
}
4850

51+
public function testEventDispatcherAutowiring()
52+
{
53+
static::bootKernel(array('debug' => false));
54+
$container = static::$kernel->getContainer();
55+
56+
$autowiredServices = $container->get('test.autowiring_types.autowired_services');
57+
$this->assertInstanceOf(ContainerAwareEventDispatcher::class, $autowiredServices->getDispatcher(), 'The event_dispatcher service should be injected if the debug is not enabled');
58+
59+
static::bootKernel(array('debug' => true));
60+
$container = static::$kernel->getContainer();
61+
62+
$autowiredServices = $container->get('test.autowiring_types.autowired_services');
63+
$this->assertInstanceOf(TraceableEventDispatcher::class, $autowiredServices->getDispatcher(), 'The debug.event_dispatcher service should be injected if the debug is enabled');
64+
}
65+
4966
protected static function createKernel(array $options = array())
5067
{
5168
return parent::createKernel(array('test_case' => 'AutowiringTypes') + $options);

src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Bundle/TestBundle/AutowiringTypes/AutowiredServices.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,21 @@
1414
use Doctrine\Common\Annotations\Reader;
1515
use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface as FrameworkBundleEngineInterface;
1616
use Symfony\Component\Templating\EngineInterface;
17+
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
1718

1819
class AutowiredServices
1920
{
2021
private $annotationReader;
2122
private $frameworkBundleEngine;
2223
private $engine;
24+
private $dispatcher;
2325

24-
public function __construct(Reader $annotationReader = null, FrameworkBundleEngineInterface $frameworkBundleEngine, EngineInterface $engine)
26+
public function __construct(Reader $annotationReader = null, FrameworkBundleEngineInterface $frameworkBundleEngine, EngineInterface $engine, EventDispatcherInterface $dispatcher)
2527
{
2628
$this->annotationReader = $annotationReader;
2729
$this->frameworkBundleEngine = $frameworkBundleEngine;
2830
$this->engine = $engine;
31+
$this->dispatcher = $dispatcher;
2932
}
3033

3134
public function getAnnotationReader()
@@ -42,4 +45,9 @@ public function getEngine()
4245
{
4346
return $this->engine;
4447
}
48+
49+
public function getDispatcher()
50+
{
51+
return $this->dispatcher;
52+
}
4553
}

0 commit comments

Comments
 (0)
0