Skip to content

Commit f8a5229

Browse files
committed
WIP
1 parent 9bf179a commit f8a5229

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

src/Symfony/Bridge/Monolog/Handler/ConsoleHandler.php

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use Symfony\Component\Console\ConsoleEvents;
2121
use Symfony\Component\Console\Event\ConsoleCommandEvent;
2222
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
23+
use Symfony\Component\Console\Input\InputInterface;
2324
use Symfony\Component\Console\Output\ConsoleOutputInterface;
2425
use Symfony\Component\Console\Output\OutputInterface;
2526
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
@@ -52,6 +53,8 @@ final class ConsoleHandler extends AbstractProcessingHandler implements EventSub
5253
OutputInterface::VERBOSITY_DEBUG => Level::Debug,
5354
];
5455

56+
private ?InputInterface $input = null;
57+
5558
/**
5659
* @param OutputInterface|null $output The console output to use (the handler remains disabled when passing null
5760
* until the output is set, e.g. by using console events)
@@ -64,6 +67,7 @@ public function __construct(
6467
bool $bubble = true,
6568
array $verbosityLevelMap = [],
6669
private array $consoleFormatterOptions = [],
70+
private bool $interactiveOnly = false,
6771
) {
6872
parent::__construct(Level::Debug, $bubble);
6973

@@ -74,7 +78,19 @@ public function __construct(
7478

7579
public function isHandling(LogRecord $record): bool
7680
{
77-
return $this->updateLevel() && parent::isHandling($record);
81+
return
82+
$this->updateLevel()
83+
&& parent::isHandling($record)
84+
&& (!$this->interactiveOnly || ($this->input && $this->input->isInteractive()));
85+
}
86+
87+
public function getBubble(): bool
88+
{
89+
if ($this->isInteractiveOnlyEnabled()) {
90+
return false;
91+
}
92+
93+
return parent::getBubble();
7894
}
7995

8096
public function handle(LogRecord $record): bool
@@ -84,6 +100,11 @@ public function handle(LogRecord $record): bool
84100
return $this->updateLevel() && parent::handle($record);
85101
}
86102

103+
public function setInput(InputInterface $input): void
104+
{
105+
$this->input = $input;
106+
}
107+
87108
/**
88109
* Sets the console output to use for printing logs.
89110
*/
@@ -108,6 +129,8 @@ public function close(): void
108129
*/
109130
public function onCommand(ConsoleCommandEvent $event): void
110131
{
132+
$this->setInput($event->getInput());
133+
111134
$output = $event->getOutput();
112135
if ($output instanceof ConsoleOutputInterface) {
113136
$output = $output->getErrorOutput();
@@ -175,4 +198,9 @@ private function updateLevel(): bool
175198

176199
return true;
177200
}
201+
202+
private function isInteractiveOnlyEnabled(): bool
203+
{
204+
return $this->interactiveOnly && $this->input && $this->input->isInteractive();
205+
}
178206
}

src/Symfony/Bridge/Monolog/Tests/Handler/ConsoleHandlerTest.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,4 +238,30 @@ public function testLogsFromListeners()
238238
$this->assertStringContainsString('Before terminate message.', $out = $output->fetch());
239239
$this->assertStringContainsString('After terminate message.', $out);
240240
}
241+
242+
public function testInteractiveOnly()
243+
{
244+
$output = $this->createMock(OutputInterface::class);
245+
246+
$message = RecordFactory::create(Level::Info, 'My info message');
247+
$interactiveInput = $this->createMock(InputInterface::class);
248+
$interactiveInput
249+
->method('isInteractive')
250+
->willReturn(true);
251+
$handler = new ConsoleHandler(interactiveOnly: true);
252+
$handler->setInput($interactiveInput);
253+
$handler->setOutput($output);
254+
self::assertTrue($handler->isHandling($message), '->isHandling returns true when input is interactive');
255+
self::assertFalse($handler->getBubble(), '->getBubble returns false when input is interactive and interactiveOnly is true');
256+
257+
$nonInteractiveInput = $this->createMock(InputInterface::class);
258+
$nonInteractiveInput
259+
->method('isInteractive')
260+
->willReturn(false);
261+
$handler = new ConsoleHandler(interactiveOnly: true);
262+
$handler->setInput($nonInteractiveInput);
263+
$handler->setOutput($output);
264+
self::assertFalse($handler->isHandling($message), '->isHandling returns false when input is not interactive');
265+
self::assertTrue($handler->getBubble(), '->getBubble returns true when input is not interactive and interactiveOnly is true');
266+
}
241267
}

0 commit comments

Comments
 (0)