这个其实挺nice的,因为在之前的版本里,当我们测试邮件的时候,我们要么实际去发送一封邮件,比如你配置一个qq邮箱来测试,像我们之前的这篇文章里说的,或者呢就用专门的邮件测试服务,比如Mailtrap,像我们Laravel底层应用实战解密里介绍的那样,这可能稍微有点门槛吧~

在5.5里呢,又多了一个选项,就是直接将你测试邮件的内容在浏览器里渲染出来,说白了就是可以直接预览你的邮件视图(email blade),到这里其实我想问,这功能我们不能自行实现吗,尤其是之前学过Laravel底层应用实战解密的同学们?

我们实际来看一下,首先创建一个mailable class

php artisan make:mail Welcome --markdown=emails.welcome

这 期间--markdown=emails.welcome的意思是使用markdown格式的邮件视图模板(mail template),对这个不太熟悉的同学可以看看官方文档。这里之所以用这个markdown形式的模板,只是因为它默认有些内容好用来演示,接下来创建一个测试路由:

Route::get('/email', function () {
   return new App\Mail\Welcome();
});

然后我们访问该路由,应该能看到类似页面:

这背后的实现原理是,在laravel 5.5中,Mailable Class实现(implement)了Renderable Interface(在laravel里,Interface喜欢被称为contract ),这个Renderable Interface里有个render()方法需要Mailable class来具体实现,也就是这样的:

//lluminate/Mail/Mailable.php

public function render()
{
    Container::getInstance()->call([$this, 'build']);

    return Container::getInstance()->make('mailer')->render(
        $this->buildView(), $this->buildViewData()
    );
}

咳咳,Container::getInstance()看着眼熟吗?学过Laravel底层应用实战解密的同学应该知道其背后的深意了吧~

如果我们在routes里return一个没有implement Renderable contract的mail实例,那么就会报一个UnexpectedValueException的异常。

话说回来,你总归要实际配置邮件那些的,不是吗?

自定义邮件样式主题(css theme)

像上图看到的那样,如果使用markdown格式的邮件视图,laravel会默认提供一个主题样式,但是现实中,我们往往想对其进行自定义,比如加上自己的logo什么的,那么如果想对某个特定的mailable邮件使用自定义主题,我们可以这样做:

首先,创建一个包含你自定义主题样式的.css文件,放在下面位置:

resources/views/vendor/mail/html/themes/custom.css

然后在你相应的Mailable class里,定义一下$theme这个属性即可:

//app/Mail/Welcome.php

class Welcome extends Mailable
{
    protected $theme = 'custom';
    [...]
}

这样的话,你的邮件渲染的时候就会使用你custom.css里定义的样式,使用这种方式,我们可以给我们不同的邮件使用不同的主题,nice~