Search code examples
phplaravellaravel-5.1laravel-artisan

Write output to console from helper class


I have a console command that runs a helper class and I want to write output with $this->info() to the console from the helper class.

My code looks like this:

App/Http/Console/Commands/SomeCommand.php

function handle(Helper $helper)
{
    return $helper->somefunction();
}

App/Http/SomeHelper.php

function somefunction()
{
    //some code
    $this->info('send to console');
}

Is there any way to write the output to console from the helper?


Solution

  • I finally figured this out (works in Laravel 5.6)

    In the handle() function of your SomeCommand class, add $this->myHelper->setConsoleOutput($this->getOutput());.

    In your helper class, add:

    /**
     *
     * @var \Symfony\Component\Console\Style\OutputStyle 
     */
    protected $consoleOutput;
    
    /**
     * 
     * @param \Symfony\Component\Console\Style\OutputStyle $consoleOutput
     * @return $this
     */
    public function setConsoleOutput($consoleOutput) {
        $this->consoleOutput = $consoleOutput;
        return $this;
    }
    
    /**
     * 
     * @param string $text
     * @return $this
     */
    public function writeToOuput($text) {
        if ($this->consoleOutput) {
            $this->consoleOutput->writeln($text);
        }
        return $this;
    }
    
    /**
     * 
     * @param string $text
     * @return $this
     */
    public function writeErrorToOuput($text) {
        if ($this->consoleOutput) {
            $style = new \Symfony\Component\Console\Formatter\OutputFormatterStyle('white', 'red', ['bold']); //white text on red background
            $this->consoleOutput->getFormatter()->setStyle('error', $style);
            $this->consoleOutput->writeln('<error>' . $text . '</error>');
        }
        return $this;
    }
    

    Then, anywhere else in your helper class, you can use:

    $this->writeToOuput('Here is a string that I want to show in the console.');