本书未发布

邮件

未匹配的标注

在包中使用电子邮件的方式与在普通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';
        });
    }
}

通过此通过测试,您可以确定您的包现在可以发送电子邮件了。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/laravel-package...

译文地址:https://learnku.com/docs/laravel-package...

上一篇 下一篇
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~