Laravel 从 MessageSending 事件获取邮件类名

Yas*_*che 5 php laravel laravel-5

我使用的是 Laravel 5.7,当使用 Mail 接口发送电子邮件时,会触发Mail\Events\MessageSending和两个事件Mail\Events\MessageSent,因此我的目标是捕获 MessageSending 事件并获取用于发送电子邮件的可邮寄类(示例mail\Ordershipped)并停止它。

<?php

namespace App\Listeners;

use Illuminate\Mail\Events\MessageSending;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class LogSendingMessage
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  MessageSending  $event
     * @return void
     */
    public function handle(MessageSending $event)
    {

        //here i want to check what mailable class used and stop it.
        if ($mailable == 'Ordershipped')
        return false;

        // if another mailable class (example: userVerification)
        else
        
         return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

hdi*_*fen 8

此时,事件不知道可邮寄类型是什么,因为 HTML 已经从刀片构建。

但是,您可以将值附加到可邮寄中的基础 swift 邮件类。

在您的App\Mail文件夹中创建一个名为Mailable.php. 现在,这是您的新可邮寄类,您的所有可邮寄类都将扩展自该类。

namespace App\Mail;
use Illuminate\Contracts\Mail\Mailer as MailerContract;
use Illuminate\Mail\Mailable as BaseMailable; // Extend off laravel mailable

abstract class Mailable extends BaseMailable
{
    public function send(MailerContract $mailer)
    {
        //Initializes properties on the Swift Message object
        $this->withSwiftMessage(function ($message) {
            $message->mailable = get_class($this);
        });

        parent::send($mailer);
    }
}
Run Code Online (Sandbox Code Playgroud)

将此类用于所有邮件,如下所示:

use App\Mail\Mailable; // This is your new mailable parent class

class UserConfirmEmail extends Mailable
{
    public function build()
    {
         // Build email
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以从 swift_mail 对象获取可邮寄的名称,该对象是$event变量的消息属性,例如$event->message

// App\Listeners\LogMessageSending.php
public function handle(MessageSending $event)
{

    //here i want to check what mailable class used and stop it.
    if ($event->message->mailable == 'Ordershipped') {
        return false;
    }
    // if another mailable class (example: userVerification)
    else {
     return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在 Laravel 9 中,它是 `$this-&gt;withSymfonyMessage(...)` 而不是 `$this-&gt;withSwiftMessage(...)` (2认同)