我有一个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([...])[...]
(new DummyMail($this->title, $this->name))->render();
。事件未触发,我的AJAX请求的响应也未成功,storage/logs/laravel.log
和apache2日志均无济于事。$this->buildMarkdownView()
,它应该有一个名为html
的密钥,该密钥应该为我提供模板,但是会抛出一个错误,提示'找不到 View []。 '。那么,如何简单地将为电子邮件生成的视图作为字符串返回,以便可以将其传递给我计划发出的事件?
答案 0 :(得分:0)
因此,我设法渲染了模板并将其传递给事件,它可能不是最“雄辩”的解决方案,但似乎可以完成工作。
在您的Mailable中公开定义将要使用的视图:
public $view = 'mail.dummy-tpl';
在build
函数中,在$this->from('dummy@test.com')[...]
之后,我们需要以字符串形式获取渲染的模板:
$tpl = view($this->view, [
'title' => $this->title,
'name' => $this->name,
])->render();
我注意到您不需要使用render
函数以字符串形式返回呈现的模板,但是我建议在任何地方都建议使用render
,因此最好是明确的。
最后,使用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类)