如何在trands SendsPasswordResetEmails中的broker()函数返回\ Illuminate \ Contracts \ Auth \ PasswordBroker?

时间:2016-10-22 10:44:09

标签: laravel laravel-5.2 laravel-5.1 laravel-5.3

我正在使用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的情况如何?

2 个答案:

答案 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}},如果没有'方法将会调用它在该类中具有该名称(并且该方法被静态调用)。 然后,使用__callStaticgetFacadeRoot方法找出实际调用的内容。然后它获取该调用的实例并在其上调用此方法(在此示例中为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方法进行静态调用。这里的PasswordFacade,在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);
}