Skip to content

Commit 01c90db

Browse files
committed
Fix signal handlers called after event listeners and skip exit
1 parent 005ed05 commit 01c90db

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

Application.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -1012,10 +1012,6 @@ protected function doRunCommand(Command $command, InputInterface $input, OutputI
10121012
});
10131013
}
10141014
}
1015-
1016-
foreach ($commandSignals as $signal) {
1017-
$this->signalRegistry->register($signal, [$command, 'handleSignal']);
1018-
}
10191015
}
10201016

10211017
if (null !== $this->dispatcher) {
@@ -1034,6 +1030,10 @@ protected function doRunCommand(Command $command, InputInterface $input, OutputI
10341030
});
10351031
}
10361032
}
1033+
1034+
foreach ($commandSignals as $signal) {
1035+
$this->signalRegistry->register($signal, [$command, 'handleSignal']);
1036+
}
10371037
}
10381038

10391039
if (null === $this->dispatcher) {

Tests/ApplicationTest.php

+18
Original file line numberDiff line numberDiff line change
@@ -1975,6 +1975,21 @@ public function testSignalableCommandInterfaceWithoutSignals()
19751975
$this->assertSame(0, $application->run(new ArrayInput(['signal'])));
19761976
}
19771977

1978+
public function testSignalableCommandHandlerCalledAfterEventListener()
1979+
{
1980+
$command = new SignableCommand();
1981+
1982+
$subscriber = new SignalEventSubscriber();
1983+
1984+
$dispatcher = new EventDispatcher();
1985+
$dispatcher->addSubscriber($subscriber);
1986+
1987+
$application = $this->createSignalableApplication($command, $dispatcher);
1988+
$application->setSignalsToDispatchEvent(\SIGUSR1);
1989+
$this->assertSame(1, $application->run(new ArrayInput(['signal'])));
1990+
$this->assertSame([SignalEventSubscriber::class, SignableCommand::class], $command->signalHandlers);
1991+
}
1992+
19781993
/**
19791994
* @group tty
19801995
*/
@@ -2076,6 +2091,7 @@ public function isEnabled(): bool
20762091
class BaseSignableCommand extends Command
20772092
{
20782093
public $signaled = false;
2094+
public $signalHandlers = [];
20792095
public $loop = 1000;
20802096
private $emitsSignal;
20812097

@@ -2116,6 +2132,7 @@ public function getSubscribedSignals(): array
21162132
public function handleSignal(int $signal): void
21172133
{
21182134
$this->signaled = true;
2135+
$this->signalHandlers[] = __CLASS__;
21192136
}
21202137
}
21212138

@@ -2127,6 +2144,7 @@ public function onSignal(ConsoleSignalEvent $event): void
21272144
{
21282145
$this->signaled = true;
21292146
$event->getCommand()->signaled = true;
2147+
$event->getCommand()->signalHandlers[] = __CLASS__;
21302148
}
21312149

21322150
public static function getSubscribedEvents(): array

0 commit comments

Comments
 (0)