我还是Laravel 5.1的新手,但我发现文档非常奇怪且令人困惑。
例如 - 根据Laravel文档,我可以使用Mail Facade中的send()方法发送电子邮件。
到目前为止,这么好。当我去Laravel API并找到Illuminate Support Facades Mail这样的方法不存在? https://laravel.com/api/5.1/Illuminate/Support/Facades/Mail.html
我如何理解此方法采用的参数以及成功/失败时返回的参数?
答案 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}}时使用的类。
您还可以通过转储类名称来快速找到班级名称:Mail
答案 1 :(得分:1)
Facade类基本上是帮助类,可以快速,方便地访问执行工作的真正类。关于外墙的优点存在很多争论,但这不是针对这个问题的。
如果您在立面上调用getFacadeRoot()
方法,它将为您提供正面指向的对象的实例(例如Mail::getFacadeRoot() == \Illuminate\Mail\Mailer
)。
现在您知道正在使用的实际对象,您可以在该对象上查找方法。您在Facade上调用的任何方法都将传递给getFacadeRoot()
返回的对象。因此,当您呼叫Mail::send()
时,您实际上正在呼叫\Illuminate\Mail\Mailer::send()
(但非静态地)。