Laravel 5.1邮件文档 - 令人困惑?

时间:2016-01-18 09:15:28

标签: php email laravel

我还是Laravel 5.1的新手,但我发现文档非常奇怪且令人困惑。

例如 - 根据Laravel文档,我可以使用Mail Facade中的send()方法发送电子邮件。

到目前为止,这么好。当我去Laravel API并找到Illuminate Support Facades Mail这样的方法不存在? https://laravel.com/api/5.1/Illuminate/Support/Facades/Mail.html

我如何理解此方法采用的参数以及成功/失败时返回的参数?

2 个答案:

答案 0 :(得分:1)

那是因为它正在使用Facade模式。

app.php配置文件中,有一个名为'别名'的部分。该部分中有一行:'Mail' => Illuminate\Support\Facades\Mail::class,指向Facade,它返回key中绑定的service container (IoC),返回要使用的类/对象。

因此,您需要找到创建绑定的位置。绑定由方法App::bind('foo', .. )App::singleton('foo', .. )App::instance('foo', .. )创建。

我搜索'mailer'并找到创建绑定的文件lluminate\Mail\MailServiceProvider

$this->app->singleton('mailer', function($app) {
    ...

    // this is the class resolved by the IoC.
    $mailer = new Mailer(
        $app['view'], $app['swift.mailer'], $app['events']
    );

    ...

    return $mailer;
});

正如您所看到的,\Illuminate\Mail\Mailer中会返回班级service provider,这是您使用名为Facade的{​​{1}}时使用的类。

快速发现Facade背后的课程:

您还可以通过转储类名称来快速找到班级名称:Mail

更多信息

  • 有关服务容器的更多信息:Click!
  • 有关Laravel 5中Facades的更多信息:Click!
  • 有关Facade模式的更多信息:Click!

答案 1 :(得分:1)

Facade类基本上是帮助类,可以快速,方便地访问执行工作的真正类。关于外墙的优点存在很多争论,但这不是针对这个问题的。

如果您在立面上调用getFacadeRoot()方法,它将为您提供正面指向的对象的实例(例如Mail::getFacadeRoot() == \Illuminate\Mail\Mailer)。

现在您知道正在使用的实际对象,您可以在该对象上查找方法。您在Facade上调用的任何方法都将传递给getFacadeRoot()返回的对象。因此,当您呼叫Mail::send()时,您实际上正在呼叫\Illuminate\Mail\Mailer::send()(但非静态地)。