broker() 如何在特征 SendsPasswordResetEmails return \Illuminate\Contracts\Auth\PasswordBroker 中发挥作用?

how broker() function in trait SendsPasswordResetEmails return \Illuminate\Contracts\Auth\PasswordBroker?

我正在使用Laravel 5.3,在忘记密码控制器中,有Trait SendsPasswordResetEmails

如果你去它的定义,有一个叫做 broker() 的函数,它 returns contract 类型 \Illuminate\Contracts\Auth\PasswordBroker

如果转到 \Illuminate\Contracts\Auth\PasswordBroker ,则没有名称为 broker() 的函数声明

甚至在它的派生中也没有 class \Illuminate\Auth\Passwords\PasswordBroker.php

我看到它出现在 \Illuminate\Auth\Passwords\PasswordBrokerManager.php

问题:请问broker()如何在trait SendsPasswordResetEmailsreturn\Illuminate\Contracts\Auth\PasswordBroker中发挥作用?

Password 外观 returns Illuminate\Auth\Passwords\PasswordBrokerManager 的实例。

PasswordBrokerManager 中有一个名为 broker 的方法。方法 broker 然后 returns 是 PasswordBroker 的一个实例。

基本上,这个:

Password::broker();

只是另一种写法:

$manager = new PasswordBrokerManager();
return $manager->broker();

您返回的是该方法的结果,而不是方法本身。

Facades 的工作方式(简而言之)。

Facades 为您提供了一种无需 new 即可获得 class 的方法(它们还有其他一些好处,但我们不需要深入探讨) . 您会注意到,您总是会从 Facade 静态调用方法,这是因为在名为 __callStatic 的 Facade 中有一个 magic method,如果该 __callStatic 中没有方法,它将被调用 class 使用该名称(并且静态调用该方法)。 然后使用 getFacadeRootgetFacadeAccessor 方法找出实际要调用的内容。然后它获取该调用的一个实例并在其上调用此方法(在此示例中 broker)。

如果你去 Illuminate\Auth\Passwords\PasswordResetServiceProvider 你会看到:

 $this->app->singleton('auth.password', function ($app) {
        return new PasswordBrokerManager($app);
    });

以上是告诉 Laravelauth.password 注册为实例 PasswordBrokerManager。然后在 Password Facade class 你会看到:

protected static function getFacadeAccessor()
{
    return 'auth.password';
}

希望对您有所帮助!

这是 SendsPasswordResetEmails 特征 中的方法 broker:

/**
 * Get the broker to be used during password reset.
 *
 * @return \Illuminate\Contracts\Auth\PasswordBroker
 */
public function broker()
{
    return Password::broker();
}

该方法对 PasswordBrokerManager class 中的 broker() 方法进行静态调用。这里的Password是一个Facade,在那个Facade中,你会看到这个方法:

/**
 * Get the registered name of the component.
 *
 * @return string
 */
protected static function getFacadeAccessor()
{
    return 'auth.password';
}

这只是 returns auth.password 最终解析为 Illuminate\Auth\Passwords\PasswordBrokerManager 的字符串。您可以在 Facade Class Reference.

下的文档中看到它

最后,在 PasswordBrokerManager class 中,您有 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);
}