邮件
在包中使用电子邮件的方式与在普通Laravel应用程序中使用电子邮件非常相似。 但是,在包中,您需要确保从包中加载views
目录(或最终用户的导出版本)。
要发送电子邮件, 我们需要创建 1) 一个新的可邮件的类 并且 2) 电子邮件 模板.
电子邮件模板可以采用常规的 markdown 或 blade 模板格式.在此示例中,我们将专注于编写Blade模板,但是如果您使用Markdown模板,请使用 $this->markdown('blogpackage::mails.welcome')
替换 $this->view('blogpackage::mails.welcome')
。注意,我们正在使用命名空间的视图名称,这允许用户导出视图并更新其内容。
创建可邮件的类
首先在 src/
目录下创建一个 Mail
文件夹来存放你的可邮件的实现类。让我们将这个类取名为 WelcomeMail.php
。由于我们在上一节中一直使用 Post
模型,因此让我们在构造函数中接受该模型并将其分配给可邮件类上的public $ post
属性。
<?php
// 'src/Mail/WelcomeMail.php'
namespace JohnDoe\BlogPackage\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use JohnDoe\BlogPackage\Models\Post;
class WelcomeMail extends Mailable
{
use Queueable, SerializesModels;
public $post;
public function __construct(Post $post)
{
$this->post = $post;
}
public function build()
{
return $this->view('blogpackage::emails.welcome');
}
}
注册视图目录
在对可邮件对象的view()
方法的调用中,我们指定了字符串 emails.welcome
,Laravel 会将其转换为在包的视图注册目录中的 emails
目录搜索 welcome.blade.php
。
要指定视图目录,您需要将 $this->loadViews()
调用添加到包 service provider 中的 boot()
方法。 视图文件可以由指定的名称空间引用, 在本示例中为 「blogpackage」。 如果你从路由章节开始学习 ,你就已经添加过它了。
// 'BlogPackageServiceProvider.php'
public function boot()
{
// ... 一些其他的
$this->loadViewsFrom(__DIR__.'/../resources/views', 'blogpackage');
}
这将在包根目录中的 resources/views
目录中查找视图。
创建Blade邮件模板
在 resources/views/emails
目录中创建 welcome.blade.php
文件,其中 $ post
变量可在模板中自由使用。
// 'resources/views/emails/welcome.blade.php'
<p>
Dear reader,
Post title: {{ $post->title }}
-- Sent from the blogpackage
</p>
测试邮件
为了测试电子邮件是否有效并且邮件实际上包含所有正确的信息, 测试模拟器 提供了内置的 fake()
方法,在我们的测试中可以轻松地将真的邮件程序交换为模拟文件。
为了演示如何测试我们的电子邮件,请在 tests/unit
目录中创建一个新的 WelcomeMailTest
。接下来,在测试中:
- 使用
Mail::fake()
将Mail实现切换为模拟。 - 使用我们的工厂创建一个
Post
(参见 Models and Migrations)。 - 使用
assertNothingSent()
判断在当前阶段没有发送任何邮件。 - 发送一个新的
WelcomeMail
并传入Post
模型。 - 使用
assertSent()
判断邮件中包含Post
模型。
<?php
namespace JohnDoe\BlogPackage\Tests\Unit;
use Illuminate\Support\Facades\Mail;
use JohnDoe\BlogPackage\Mail\WelcomeMail;
use JohnDoe\BlogPackage\Models\Post;
use JohnDoe\BlogPackage\Tests\TestCase;
class WelcomeMailTest extends TestCase
{
/** @test */
public function it_sends_a_welcome_email()
{
Mail::fake();
$post = factory(Post::class)->create(['title' => 'Fake Title']);
Mail::assertNothingSent();
Mail::to('test@example.com')->send(new WelcomeMail($post));
Mail::assertSent(WelcomeMail::class, function ($mail) use ($post) {
return $mail->post->id === $post->id
&& $mail->post->title === 'Fake Title';
});
}
}
通过此通过测试,您可以确定您的包现在可以发送电子邮件了。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: