🎉 Acceso anticipado Black Friday: Hasta un 80% de descuento en nuestros cursos

4d: 20h: 43m:45s'
Javier
Javier
Laravel
Comparte:

Notificar al usuario al acabar un evento

Hola, 
tengo una cuestión sobre Livewire y no se muy bien como podría realizarse. 
Actualmente hago lo siguiente:
 
Al enviarse un formulario, si no hay fallos de validación, se hace un dispatch de una tarea (Job) que cuando acaba notifica que ha finalizado al usuario que realizó la petición y Livewire solo muestra una mensaje de sesión indicando que la tarea se está llevando a cabo y hasta ahí bien, 
Lo que quiero conseguir: 
Quiero evitar tener que enviar una notificación al usuario, y hacer que Livewire reaccione y avise cuando acabe la tarea  (Job) al usuario que la solicitó.
Esto es lo que hay en el componente Livewire.
/**
 * @throws AuthorizationException
 */
public function storeInvoice(string $typeInvoice)
{
    $this->authorize('create', Thing::class);
    $validation = Validator::make($this->data, [
        ....
    ]);
    $validatedData = $validation->validate();
    if (!$validation->fails()) {
        GenerateThing::dispatch(auth()->user(), $validatedData);
        $this->reset('data');
        session()->flash('status', __('The task is in process.'));
    }
}

Y esto es lo que hay en el handle del Job.
/**
 * Execute the job.
 *
 * @return void
 */
 public function handle(): void
{
    $this->startProcess();
    $this->user->notify(new ThingProcessCompleted([
        'title' => __('Process concluded'),
        'message' => __('The creation of the thing has been processed..'),
        'link' => ''
    ]));
} 

Entonces mi duda es, ¿de que forma se podría hacer para que Livewire detecte que el Job ha finalizado y que reaccione mostrando una notificación visual al usuario para que sepa que acabó?
Gracias de antemano por la ayuda que me prestéis.
johnny bonaci
johnny bonaci (1548 xp)
Hola Javier, una forma de detectar que el jobs termino o la queue en este caso que seria tu cola de procesos.

es con estos metodos, que por lo general lo debes ejecutar desde un service Provider

te dejo el link con la documentacion de laravel

https://laravel.com/docs/9.x/queues#job-events
<?php
 
namespace App\Providers;
 
use Illuminate\Support\Facades\Queue;
use Illuminate\Support\ServiceProvider;
use Illuminate\Queue\Events\JobProcessed;
use Illuminate\Queue\Events\JobProcessing;
 
class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
 
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Queue::before(function (JobProcessing $event) {
            // $event->connectionName
            // $event->job
            // $event->job->payload()
        });
 
        Queue::after(function (JobProcessed $event) {
            // $event->connectionName
            // $event->job
            // $event->job->payload()
        });
    }
}
1
Javier
Javier (20 xp)
Muchas gracias por tu respuesta @JohnnyB.
Estudiaré el tema para aplicarlo y ver si consigo mi objetivo.
Un saludo.
1