Laravel:在计划任务完成后发送slack通知

tez616oj  于 2023-04-13  发布在  其他
关注(0)|答案(3)|浏览(135)

我需要在一个使用Laravel构建的应用程序上安排一些任务,我想在这些任务完成后发送一个松弛通知。
Laravel提供了一个“after”钩子(https://laravel.com/docs/5.8/scheduling#task-hooks),所以我可以这样做:

$schedule->command('mycommand')
     ->daily()
     ->after(function () {
         // How can I access the command's name and output from here?
     });

我试过使用$this->output,但$this指向App\Console\Kernel,它显示为Undefined property: App\Console\Kernel::$output。我也试过向闭包传递一个参数,但我认为我需要指定一个类型,但我不知道,文档也不是很清楚。
有人知道怎么做吗?
先谢谢你了!

tv6aics1

tv6aics11#

假设你能指挥这个

$this->info('hello');

在您的内核中,可以将输出发送到一个临时文件,然后读取该文件并发送

/** @var \Illuminate\Console\Scheduling\Event $command */
$command = $schedule->command('mycommand')
    ->daily()
    ->sendOutputTo('storage/app/logs.txt');

$command->after(function () use ($command) {
    \Log::debug([$command->command, $command->output]);
    \Log::debug(file_get_contents($command->output));
});

你会得到

[2019-10-11 13:03:38] local.DEBUG: array (
  0 => '\'/usr/bin/php7.3\' \'artisan\' command:name',
  1 => 'storage/app/logs.txt',
)  
[2019-10-11 13:03:38] local.DEBUG: hello

也许这将是时间重新打开这个建议https://github.com/laravel/ideas/issues/122#issuecomment-228215251

dgsult0t

dgsult0t2#

你的命令会生成什么样的输出?是命令行还是只是一个你试图传递给after()的变量?
或者,在命令的handle()方法中,您可以在所有代码执行后调用所需的命令,甚至可以向命令传递参数。
您可以使用Artisan来执行此操作

Artisan::call('*command_name_here*');
wsewodh2

wsewodh23#

在应用服务提供程序中为控制台计划事件定义宏:

namespace App\Providers;

use Illuminate\Console\Scheduling\Event;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\ServiceProvider;
 
class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Event::macro('slackOutput', function (bool $onlyIfOutputExists = false): self {
            return $this->thenWithOutput(
                function ($output) {
                    $level = $this->exitCode === 0
                        ? 'info'
                        : 'error';

                    Log::channel('slack')
                        ->log(
                            $level,
                            $this->getEmailSubject(),
                            [
                                'output' => $output,
                            ]
                        );
                },
                $onlyIfOutputExists
            );
        });
    }
}

如果你想要slack日志,即使没有输出,也可以这样使用它:

$schedule
    ->command('inspire')
    ->slackOutput();

如果你只想在有输出的情况下使用slack日志,可以这样使用:

$schedule
    ->command('inspire')
    ->slackOutput(true);

我在Laravel 9. YMMV上。

相关问题