我正在使用Laravel 5.3,在Forgot Password Controller中,有Trait SendsPasswordResetEmails
如果按照它的定义,有一个名为broker()
的函数,它返回contract
类型的\Illuminate\Contracts\Auth\PasswordBroker
如果你转到\Illuminate\Contracts\Auth\PasswordBroker
,则没有名称为broker()
的函数声明
甚至没有在它的派生类\Illuminate\Auth\Passwords\PasswordBroker.php
我看到它出现在\Illuminate\Auth\Passwords\PasswordBrokerManager.php
问题:您能否告诉我broker()
trait SendsPasswordResetEmails
函数返回\Illuminate\Contracts\Auth\PasswordBroker
的情况如何?
答案 0 :(得分:6)
Password
外观返回Illuminate\Auth\Passwords\PasswordBrokerManager
的实例。
在PasswordBrokerManager
中,有一个名为broker
的方法。方法broker
然后返回PasswordBroker
的实例。
基本上,这个:
Password::broker();
只是另一种写作方式:
$manager = new PasswordBrokerManager();
return $manager->broker();
您将返回该方法的结果而不是方法本身。
Facades
的工作方式(简而言之)。
Facades为您提供了一种无需new
即可获得课程的方式(它们还有一些其他好处,但我们不需要进入它们)。
您会注意到,您将始终静态地从Facade调用方法,这是因为在外观中有一个名为magic method
的{{1}},如果没有'方法将会调用它在该类中具有该名称(并且该方法被静态调用)。
然后,使用__callStatic
和getFacadeRoot
方法找出实际调用的内容。然后它获取该调用的实例并在其上调用此方法(在此示例中为getFacadeAccessor
)。
如果你转到broker
,你会看到:
Illuminate\Auth\Passwords\PasswordResetServiceProvider
上述内容告诉 $this->app->singleton('auth.password', function ($app) {
return new PasswordBrokerManager($app);
});
将Laravel
注册为实例auth.password
。然后在PasswordBrokerManager
Facade课程中,您将看到:
Password
希望这有帮助!
答案 1 :(得分:2)
以下broker
特征中的方法SendsPasswordResetEmails
:
/**
* Get the broker to be used during password reset.
*
* @return \Illuminate\Contracts\Auth\PasswordBroker
*/
public function broker()
{
return Password::broker();
}
该方法对broker()
类中的PasswordBrokerManager
方法进行静态调用。这里的Password
是Facade
,在Facade
中,您会看到此方法:
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'auth.password';
}
这只会返回auth.password
字符串,最终解析为Illuminate\Auth\Passwords\PasswordBrokerManager
。您可以在Facade Class Reference下的文档中看到它。
最后,在PasswordBrokerManager
课程中,您拥有broker()
方法:
/**
* Attempt to get the broker from the local cache.
*
* @param string $name
* @return \Illuminate\Contracts\Auth\PasswordBroker
*/
public function broker($name = null)
{
$name = $name ?: $this->getDefaultDriver();
return isset($this->brokers[$name])
? $this->brokers[$name]
: $this->brokers[$name] = $this->resolve($name);
}