我正在尝试使用特质扩展我的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类捕获控制台输出吗?
欢迎任何帮助!预先感谢。
答案 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 */}
}