Отправить письмо после того, как команда закончила в Laravel - PullRequest
0 голосов
/ 14 марта 2019

У меня есть команда, написанная на laravel, которую я хочу выполнить. Это займет не менее 4 часов, поэтому я хотел бы получить электронное письмо от компьютера, когда задача будет завершена. Я использую очереди, поэтому я хотел бы добавить всю операцию, но я не знаю, возможно ли это.

Это текущее задание:

public function handle()
    {

        $directory = 'pv';
        $files = Storage::allFiles($directory);
        foreach($files as $file)
        {
            $fname = basename($file);
            \Log::info('Procesando ',[$fname]);
            $arr = explode(" ", $fname);
            $day = substr($arr[2], 0, 10);
            $date = Carbon::parse($day);
            // this process goes to a queue in chunks
            Excel::queueImport(new POSImport($date), $file);
        }
    }

Как мне добавить новую работу, которая отправляет электронное письмо после того, как все закончится? Я не уверен, должен ли я сделать новую команду или новую работу. У меня уже проверена работа с электронной почтой, и она работает.

App \ Jobs \ SendMailFinished.php

public function handle()
    {
        //Sends message
        $me = 'me@example.com';
        $msg = 'Process finished';
        Mail::to($me)->queue(new TasksFinished($msg));
    }

1 Ответ

1 голос
/ 14 марта 2019

Вы можете сделать это разными способами.

Вариант 1

Отправьте письмо в конце вашего handle метода.Это наименее сложный вариант:

public function handle()
{

    // job logic...

    Mail::to($me)->queue(new TasksFinished($msg));
}

Вариант 2

Используйте withChain , чтобы связать в цепочку задание электронной почты, которое будет отправлено после успешного завершения другого задания:

YourTask::withChain([
    new SendMailFinished
])->dispatch();

Опция 3

Добавить прослушиватель событий для JobProcessed в EventServiceProvider.php:

/**
 * Register any events for your application.
 *
 * @return void
 */
public function boot()
{
    parent::boot();

    Queue::after(function (JobProcessed $event) {
        // $event->connectionName
        // $event->job
        // $event->job->payload()

        if ($was_my_job_class) {
            Mail::to($me)->queue(new TasksFinished($msg));
        }
    });
}

Вы можете использовать этот ответ stackoverflow , чтобы определитьесли обработанное задание было правильного класса.

...