phplaravelqueuefilamentphp

Can't send emails implements ShouldQueue using filamentphp and laravel


i have problems sending email when implements ShouldQueue, if i not implement ShouldQueue the emails is sended, but not when use ShouldQueue, this is my MailNotification

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

use App\Models\Company\EntrustRegistration;

class EntrustRegistrationNotification extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;

    public EntrustRegistration $registration;
    public string $action;

    /**
     * Create a new message instance.
     */
    public function __construct(EntrustRegistration $registration, string $action)
    {
        $this->registration = $registration;
        $this->action = $action;
    }

    public function build()
    {
        return $this->view('emails.entrust_registration_notification')
                    ->with([
                        'registration' => $this->registration,
                        'action' => $this->action,
                    ])
                    ->subject("Se ha {$this->action} una encomienda");
    }

}

and i have this model

<?php

namespace App\Models\Company;

use App\Mail\EntrustRegistrationNotification;
use App\Models\Company;
use Filament\Models\Contracts\HasTenants;
use Filament\Panel;
use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Mail;

class EntrustRegistration extends Model implements HasTenants
{
    use HasFactory;

    protected $fillable = [
        'nombreca',
        'tipoencomienda',
        'estado',
        'coowner_id',
        'company_id',
    ];

    protected static function booted(): void
    {
        // Event for Send Emails
        self::created(function ($registration) {
            $registration->load('coowners.guest');
            Mail::to($registration->coowners->guest->email)
                ->queue(new EntrustRegistrationNotification($registration, 'recibido'));
        });

        self::updated(function ($registration) {
            $registration->load('coowners.guest');
            Mail::to($registration->coowners->guest->email)
                ->queue(new EntrustRegistrationNotification($registration, 'actualizado'));
        });
    }

    public function companies(): BelongsTo
    {
        return $this->belongsTo(Company::class, 'company_id');
    }

    public function getTenants(Panel $panel): array|Collection
    {
        return $this->companies;
    }

    public function canAccessTenant(Model $tenant): bool
    {
        return $this->companies->contains($tenant);
    }

    public function coowners(): BelongsTo
    {
        return $this->belongsTo(Coowner::class, 'coowner_id');
    }
}

For some reason when using implements ShouldQueue it does not take the email of the coowners->guest relationship that exists in my coowner model, this is my relationship in the coowner model

    public function guest(): BelongsTo
    {
        $tenant = Filament::getTenant(); // Obtener el inquilino actual
        return $this->belongsTo(Guest::class, 'guest_id')->whereHas('companies', function ($query) use ($tenant) {
            $query->where('id', $tenant->id); // Filtrar los huéspedes relacionados con el inquilino actual
        });
    }

i try adding this line but is not working

$registration->load('coowners.guest');

i can-t understand what going on now, i have my .env with QUEUE_CONNECTION=database


Solution

  • i fix this problem with other solution, i add an TextInput in my resource for get the email:

    Forms\Components\TextInput::make('email')
                        ->label('Email')
                        ->hidden()
                        ->required(),
    

    i add this to my EntrustRegistrationResource, later i add this in my EntrustRegistrationNotification

    public EntrustRegistration $registration;
        public string $action;
        public string $email;
    
        /**
         * Create a new message instance.
         */
        public function __construct(EntrustRegistration $registration, string $action, string $email)
        {
            $this->registration = $registration;
            $this->action = $action;
            $this->email = $email;
        }
    
        public function build()
        {
            return $this->view('emails.entrust_registration_notification')
                        ->with([
                            'registration' => $this->registration,
                            'action' => $this->action,
                            'email' => $this->email,
                        ])
                        ->subject("Se ha {$this->action} una encomienda");
        }
    

    and finally my model is like this:

    // Event for Send Emails
            self::created(function ($registration) {
                $email = $registration->email; // Obtener el email directamente del modelo
                if ($email) {
                    Log::info('Email encontrado: ' . $email);
                    Mail::to($email)
                        ->queue(new EntrustRegistrationNotification($registration, 'recibido', $email));
                } else {
                    Log::warning('No se pudo encontrar el email para el registro: ' . $registration->email);
                }
            });
            
            self::updated(function ($registration) {
                $email = $registration->email; // Obtener el email directamente del modelo
                if ($email) {
                    Log::info('Email encontrado: ' . $email);
                    Mail::to($email)
                        ->queue(new EntrustRegistrationNotification($registration, 'actualizado', $email));
                } else {
                    Log::warning('No se pudo encontrar el email para el registro: ' . $registration->email);
                }
            });