如何从Laravel上的MessageSent事件访问邮件数据?

时间:2018-03-09 09:31:02

标签: php email variables laravel-5

我正在使用 laravel 5.5 ,并尝试发送带有客户端标志的图片的电子邮件。 要从视图中访问图片,我将其复制到公开文件夹中,排队的电子邮件将会访问它。

通过一个操作,我可以向客户端发送多封电子邮件,登录电子邮件,并附上电子邮件的pdf,也带有符号图片。然后,可以从不同的电子邮件中多次调用相同的图像。为此,我为每封电子邮件复制一张带有编码名称的图像,并将图像名称传递给Mailable。

问题是在有限的时间内表明客户是公开的。然后,我试图为Illuminate\Mail\Events\MessageSent事件监听,删除公共文件夹的图像,从事件中获取图像名称......但我无法访问它。

  • 如何从活动中访问可邮寄的数据?
  • 你知道更好的方法吗?

提前致谢。

Mailable类

class SEPA extends Mailable
{
    use Queueable, SerializesModels;

    public $client;

    /**
     * Create a new message instance.
     *
     * @param Client $client
     */
    public function __construct(Client $client)
    {
        $this->client = $client;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        $date = Carbon::now();

        // Name codified
        $fileName = md5(microtime()).".png";

        // Making the image accessible from views
        Storage::copy("clients/{$this->client->id}/firma.png", "public/tmp/{$fileName}");
        $pdfName = "SEPA - {$this->client->name}{$this->client->cognom1}{$this->client->cognom2}.pdf";
        $dades = [
            'data'      => $date,
            'client'    => $this->client,
            'firma'     => $fileName
        ];

        // Generating PDF
        $pdf = PDF::loadView('pdfs.SEPA', $dades);
        if (!Storage::has("tmp/clients/{$this->client->id}")) Storage::makeDirectory("tmp/clients/{$this->client->id}");
        $pdf->save(storage_path()."/app/tmp/clients/{$this->client->id}/".$pdfName);

        return $this
            ->from(['address' => 'email@random.com'])
            ->view('emails.SEPA')
            ->with($dades)
            ->attach(storage_path()."/app/tmp/clients/{$this->client->id}/".$pdfName);
    }
}

EventServiceProvider.php

protected $listen = [
    'Illuminate\Mail\Events\MessageSent' => [
        'App\Listeners\DeleteTempResources'
    ]
];

监听

public function handle(MessageSent $event)
    {
        // Trying to access on data message
        Log::info($event->message->firma);
    }

1 个答案:

答案 0 :(得分:3)

您也许可以通过withSwiftMessage()方法将事件中需要访问的其他数据设置为实际swiftMessage上的其他字段,因为在事件中可以访问的其他数据为{{ 1}}。

我看到有人这样做了here,例如添加$message对象:

$user

这对我来说似乎很不合常规-像这样添加流氓字段。

请注意,只要它是包含类的成员属性,就不需要通过$this->withSwiftMessage(function ($message) { $message->user = $this->user; // any crazy field of your choosing }); 将$ user对象放入闭包中,因为它可以通过use在作用域中使用。

要在消息离开队列时在事件中查看它,可以在$this事件中Log::info('The user: ', [$event->message->user])

我刚刚测试了它,并且它可以工作(我使用5.5),但是我还没有在代码中使用它,因为它看起来有点奇怪,并添加了一个流氓字段。我会提到它,因为如果您对这种方法感到满意,它实际上可能会解决您的问题!如果有人知道一种不太丑陋的方式,那我真是耳目一新...

P.S。对于我自己的情况,我可能会考虑在闭包中附加MessageSending,因为这似乎不太可能与任何东西发生冲突,并且可以在事件中方便地撤消。欢迎讨论!