es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obteniendo una excepción de error de propiedad indefinida al cambiar “mail::send” por “mail::queue” en Laravel 8.

Aquí hay un código que funciona:

Mail::to($emails)->send(new ExceptionOccurred($e));

Y luego lo cambio a:

Mail::to($emails)->queue(new ExceptionOccurred($e));

Cuando lo hago, obtengo el siguiente error:

ErrorException: Undefined property: App\Mail\ExceptionOccurred::$content in C:\inetpub\wwwroot\laravel\app\Mail\ExceptionOccurred.php:33

Este es el archivo ExceptionOccurred.php:

namespace App\Mail;

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

class ExceptionOccurred extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($content)
    {
        $this->content = $content;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->markdown('mail.ExceptionOccurred')
            ->subject('Exception on live instance')
            ->with('content', $this->content);
    }
}

Esta es la parte relevante del manejador de excepciones:

if ($exception instanceof Exception) {
    $e = FlattenException::create($exception);
} else {
    $e = $exception;
}

$emails = json_decode(env('MAINTAINER_EMAILS'));

if (app()->environment('production') || app()->environment('testing')) {
    Mail::to($emails)->send(new ExceptionOccurred($e));
}

Para reiterar, Mail::send() funciona, pero Mail::queue() no. Creo que la cola está configurada correctamente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error que se produce al cambiar de Mail::to($emails)->send(new ExceptionOccurred($e)); a Mail::to($emails)->queue(new ExceptionOccurred($e)); es “ErrorException: Propiedad no definida: App\Mail\ExceptionOccurred::$content en C:\inetpub\wwwroot\laravel\app\Mail\ExceptionOccurred.php:33“.

    Este error ocurre porque en el constructor de la clase ExceptionOccurred, $this->content se establece con el parámetro $content, pero en el método build(), $this->content se usa como una variable para pasar a la vista.

    Dado que la clase ahora se está encolando, se serializa y se deserializa cuando llega el momento de enviar el correo electrónico. Durante este proceso, $this->content no se está estableciendo, de ahí el error de “Propiedad no definida”.

    Para solucionar este problema, debemos actualizar la clase ExceptionOccurred para establecer $this->content en $content en el método build() en lugar de en el constructor. Esto asegurará que la variable se establezca correctamente cuando se esté construyendo el correo electrónico. La clase ExceptionOccurred actualizada se vería así:

    namespace App\Mail;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Mail\Mailable;
    use Illuminate\Queue\SerializesModels;
    
    class ExceptionOccurred extends Mailable
    {
        use Queueable, SerializesModels;
    
        public $content;
    
        public function __construct($content)
        {
            $this->content = $content;
        }
    
        public function build()
        {
            return $this->markdown('mail.ExceptionOccurred')
                        ->subject('Excepción en la instancia en vivo')
                        ->with('content', $this->content);
        }
    }
    

    Al agregar public $content; a la definición de la clase y mover la asignación del constructor al método build(), nos aseguramos de que $this->content se establezca correctamente cuando se esté construyendo el correo electrónico, independientemente de si se utiliza send() o queue().

Comments are closed.