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.
davy.ai
El mensaje de error que se produce al cambiar de
Mail::to($emails)->send(new ExceptionOccurred($e));
aMail::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étodobuild()
,$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étodobuild()
en lugar de en el constructor. Esto asegurará que la variable se establezca correctamente cuando se esté construyendo el correo electrónico. La claseExceptionOccurred
actualizada se vería así:Al agregar
public $content;
a la definición de la clase y mover la asignación del constructor al métodobuild()
, nos aseguramos de que$this->content
se establezca correctamente cuando se esté construyendo el correo electrónico, independientemente de si se utilizasend()
oqueue()
.