Feedback is an io abstraction that lets you decouple functional code and business logic from (CLI) I/O.
composer require linku/feedback
In the class or service you want to decouple, add a Feedback
attribute
and make sure it is filled with an instance of NoFeedback
by default.
In order to allow the code calling this service to override the default
feedback, add a setFeedback
method.
In the logic of your service, you can now call the feedback methods.
<?php
use Linku\Feedback\Feedback;
use Linku\Feedback\NoFeedback;
class MyService
{
/**
* @var Feedback
*/
private $feedback;
public function __construct()
{
$this->feedback = new NoFeedback();
}
public function setFeedback(Feedback $feedback): void
{
$this->feedback = $feedback;
}
public function run(): void
{
$this->feedback->info('Starting my service run');
$this->feedback->startProcess();
for ($i = 0; $i < 100; $i++) {
try {
// Do something in a loop here
} catch (\Throwable $exception) {
$this->feedback->exception($exception);
}
$this->feedback->advanceProcess();
}
$this->feedback->finishProcess();
$this->feedback->success('Completed my service run');
}
}
In the script or CLI command that uses your service, set the apropriate feedback.
<?php
$service = new MyService();
$service->setFeedback(new LoggerFeedback(new Logger()));
$service->run();
A safe fallback that doesn't output anything.
A feedback you can fill with your own anonymous functions.
A feedback that will write to any PSR-3 Logger.
A feedback that lets you use multiple feedbacks at the same time.
<?php
$myService->setFeedback(new ChainedFeedback(
new LoggerFeedback(new Logger()),
new ClosureFeedback(/* ... */)
));
If you use Symfony CLI, check out Linku/SymfonyStyleFeedback for integration with the Symfony Style component.