如何呈现可邮件的HTML?

时间:2018-11-28 17:13:28

标签: php laravel

我有一个Mailable,该Mailable接受两个参数,这些参数在发送给用户时在生成的视图中使用。我想在Mailable发送之后发出一个事件,但是,应该将一个参数传递给该事件,该事件是Mailable生成的视图的字符串版本,其中的变量已替换:

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use App\Events\CommunicationEvent;
use Illuminate\Contracts\Queue\ShouldQueue;

class DummyMail extends Mailable
{
    use Queueable, SerializesModels;

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

    /**
    * Build the message.
    *
    * @return $this
    */
    public function build()
    {
        $this->from('dummy@test.com')->subject('Howdy!')->view('mail.dummy-tpl')->with([
            'title' => $this->title,
            'name' => $this->name
        ]);
    }
}

我尝试过:

  • 在构建函数的event(new CommunicationEvent($this->render()));调用之前和之后添加$this->from([...])[...]
  • 我尝试按照建议的here呼叫(new DummyMail($this->title, $this->name))->render();。事件未触发,我的AJAX请求的响应也未成功,storage/logs/laravel.log和apache2日志均无济于事。
  • 我尝试调用$this->buildMarkdownView(),它应该有一个名为html的密钥,该密钥应该为我提供模板,但是会抛出一个错误,提示'找不到 View []。 '。

那么,如何简单地将为电子邮件生成的视图作为字符串返回,以便可以将其传递给我计划发出的事件?

1 个答案:

答案 0 :(得分:0)

因此,我设法渲染了模板并将其传递给事件,它可能不是最“雄辩”的解决方案,但似乎可以完成工作。

  1. 在您的Mailable中公开定义将要使用的视图:

    public $view = 'mail.dummy-tpl';
    
  2. build函数中,在$this->from('dummy@test.com')[...]之后,我们需要以字符串形式获取渲染的模板:

    $tpl = view($this->view, [
        'title' => $this->title,
        'name' => $this->name,             
    ])->render();
    

    我注意到您不需要使用render函数以字符串形式返回呈现的模板,但是我建议在任何地方都建议使用render,因此最好是明确的。

  3. 最后,使用event帮助器调用您选择的事件:

    event(new CommunicationEvent($tpl, $this));
    

进行上述更改后,生成的Mailable类现在应为:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use App\Events\CommunicationEvent;
use Illuminate\Contracts\Queue\ShouldQueue;

class DummyMail extends Mailable
{
    use Queueable, SerializesModels;

    public $view = 'mail.dummy-tpl';

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

    /**
    * Build the message.
    *
    * @return $this
    */
    public function build()
    {
        $this->from('dummy@test.com')->subject('Howdy!')->with([
            'title' => $this->title,
            'name' => $this->name
        ]);

        $tpl = view($this->view, [
            'title' => $this->title,
            'name' => $this->name,             
        ])->render();

        event(new CommunicationEvent($tpl, $this));        
    }
}

注意:由于我们已公开定义属性$view,因此在以下代码中不再需要view链:

$this->from('dummy@test.com')->subject('Howdy!')->view('mail.dummy-tpl')->with([
    'title' => $this->title,
    'name' => $this->name
]);`  

陷阱

确保$view属性是公共属性,否则会出现以下错误:

  

对App \ Mail \ DummyMail :: $ view的访问级别必须是公共的(如Illuminate \ Mail \ Mailable类)