从MessageSending事件中获取Laravel邮件类名

5

我正在使用laravel 5.7,当使用Mail接口发送电子邮件时会触发两个事件Mail\Events\MessageSendingMail\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;
    }
}

尝试使用 $event get_class 获取类。 - Jagadesha NH
@JagadeshaNH - 这里返回的Illuminate\Mail\Events\MessageSending事件类,我正在尝试获取可邮寄类,但还是谢谢您。 - Yassine Qoraiche
1个回答

8

目前,事件不知道可邮寄类型是什么,因为HTML已经从Blade构建好了。

然而,你可以在可邮寄类中向基础的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);
    }
}

使用这个类作为您所有可邮寄邮件的模板,如下所示:

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

class UserConfirmEmail extends Mailable
{
    public function build()
    {
         // Build email
    }
}

您可以从 swift_mail 对象中获取可邮寄名称,该对象是 $event 变量的 message 属性,例如 $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;
    }
}

听起来不错,你能告诉我如何在哪里创建一个扩展自Laravel可邮寄类的可邮寄类吗? - Yassine Qoraiche
当然,第一个代码块就是您的新可邮寄类将看起来像什么。我添加了另一个代码块,展示了您的可邮寄类将会是什么样子。 - Tom Headifen
谢谢兄弟,它正在工作。我只有一个问题,因为我正在创建一个 Laravel 包,所以我不希望用户为每个可邮寄对象更改父邮寄类,是否有任何解决方法,可以从我的包中扩展它而不直接修改可邮寄类。 - Yassine Qoraiche
@YassineQoraiche 嗯,对于一个包来说,我能想到的最优雅的解决方案是覆盖 Laravel 命令 php artisan make:mail,使用你的可邮寄类而不是 Laravel 的。然后基本上复制 Laravel 命令代码,但将你的可邮寄类放在 Laravel 的位置。 - Tom Headifen
没有我知道的优雅的方法。我认为您包的用户将不得不使用可扩展的邮件包。我认为这很好,因为您保持了它的明确性。也许您可以创建自己的邮件服务提供商,但那是有些工作的。@yassineqoraiche - Tom Headifen
2
在 Laravel 9 中,使用 $this->withSymfonyMessage(...) 替代 $this->withSwiftMessage(...) - shamaseen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接