如何将所有Artisan命令输出发送到Slack? (使用Laravel)

时间:2018-11-06 10:01:48

标签: php laravel slack artisan

我正在尝试使用特质扩展我的Laravel Artisan命令。该特征应捕获所有命令行输出并将其发送到Slack。

我已经使用this package进行了“发送消息以放松”部分。

但是我无法捕获控制台输出。这就是我所拥有的:

namespace App\Traits;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Console\Output\OutputInterface;

trait NotifiesSlack
{
    /**
     * Execute the console command.
     *
     * @param  \Symfony\Component\Console\Input\InputInterface $input
     * @param  \Symfony\Component\Console\Output\OutputInterface $output
     * @return mixed
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $consoleOutput = new BufferedOutput;

        $call = $this->laravel->call([$this, 'handle']);

        $this->notifySlack($consoleOutput->fetch());

        return $call;
    }

    public function notifySlack(string $output)
    {
        \Slack::send($output);
    }
}

我要重写正确的方法吗?还有其他方法可以从Command类捕获控制台输出吗?

欢迎任何帮助!预先感谢。

1 个答案:

答案 0 :(得分:0)

您遇到的是无法通过trait覆盖方法的常见情况。 很明显,因为在类本身中已经声明了execute方法,从而使特征无用

一种快速简便的方法是简单地创建自己的抽象命令类,以扩展Illuminate\Console\Command;并根据自己的喜好覆盖execute方法;然后将抽象命令类用于您的可松弛报告命令,作为 base

abstract class NotifiesSlackCommand extend Illuminate\Console\Command {

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        ...
    }
}

需要发送到Slack的实际命令

class ProcessImagesCommand extends NotifiesSlackCommand {
    public function handle() {/* do magic */}
}