как функция broker () в черте SendsPasswordResetEmails возвращает IlluminateContractsAuthPasswordBroker?

#laravel #laravel-5.2 #laravel-5.1 #laravel-5.3

#laravel #laravel-5 #laravel-5.1 #laravel-5.3

Вопрос:

Я использую Laravel 5.3, в контроллере Forgot Password есть Trait SendsPasswordResetEmails

если вы перейдете к ее определению, там вызывается функция broker() , она возвращает contract тип IlluminateContractsAuthPasswordBroker

если вы перейдете к IlluminateContractsAuthPasswordBroker , там нет объявления функции с именем broker()

и даже не в ее производном классе IlluminateAuthPasswordsPasswordBroker.php

Я видел, что это присутствовало в IlluminateAuthPasswordsPasswordBrokerManager.php

Вопрос: Не могли бы вы любезно рассказать, как broker() функционирует функция trait SendsPasswordResetEmails return IlluminateContractsAuthPasswordBroker ?

Ответ №1:

Password Фасад возвращает экземпляр IlluminateAuthPasswordsPasswordBrokerManager .

Внутри PasswordBrokerManager есть вызываемый метод broker . Это метод, broker который затем возвращает экземпляр PasswordBroker .

В принципе, это:

 Password::broker();
  

это просто еще один способ написать:

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

Вы возвращаете результаты этого метода, а не сам метод.

Способ Facades работы (в двух словах).

Фасады предоставляют вам способ получить класс без необходимости new его создания (у них также есть несколько других преимуществ, но нам не нужно вдаваться в них). Вы заметите, что вы всегда будете вызывать метод из фасада статически, это потому, что есть magic method в вызываемом фасаде __callStatic , который будет вызываться, если в этом классе нет метода с таким именем (а метод вызывается статически). Затем используются методы getFacadeRoot и getFacadeAccessor , чтобы выяснить, что на самом деле предназначено для вызова. Затем она получает экземпляр этого вызова и вызывает для него этот метод (в этом примере broker ).

Если вы перейдете к IlluminateAuthPasswordsPasswordResetServiceProvider , вы увидите:

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

Выше указано, Laravel что нужно зарегистрироваться auth.password в качестве экземпляра PasswordBrokerManager . Затем в Password классе Facade вы увидите:

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

Надеюсь, это поможет!

Комментарии:

1. Привет @RossWilson: Я видел Password Facade , что есть несколько частных констант и только защищенный метод. Я что-то упускаю?

2. @Helper Я обновил свой ответ, чтобы дать немного больше деталей о том, как Facade они работают.

3. Я использовал черту в контроллере. У контроллера уже есть конструктор. По некоторым причинам мне также понадобился конструктор для внедрения зависимостей в trait . К сожалению, невозможно выполнить конструктор в trait, когда у контроллера уже есть конструктор. Вопрос : Должен ли я создать фасад, который будет возвращать контракт в trait и, таким образом, вместо внедрения зависимости конструктора в trait, мы могли бы получить контракт через фасад в trait? Является ли это хорошей практикой?

4. Я не совсем уверен, что вы имеете в виду. Кроме того, поскольку это отдельный вопрос (и выходит за рамки данного), вам следует создать для него другую запись. При этом вы довольны, что мой ответ отвечает на ваш вопрос к этому сообщению?

5. это очень краткая, но четкая иллюстрация о facade !

Ответ №2:

Вот метод broker в SendsPasswordResetEmails черте:

 /**
 * Get the broker to be used during password reset.
 *
 * @return IlluminateContractsAuthPasswordBroker
 */
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 строку, которая в конечном итоге преобразуется в IlluminateAuthPasswordsPasswordBrokerManager . Вы можете увидеть это в документации в разделе Ссылка на класс фасада.

И, наконец, в PasswordBrokerManager классе у вас есть broker() метод:

 /**
 * Attempt to get the broker from the local cache.
 *
 * @param  string  $name
 * @return IlluminateContractsAuthPasswordBroker
 */
public function broker($name = null)
{
    $name = $name ?: $this->getDefaultDriver();

    return isset($this->brokers[$name])
                ? $this->brokers[$name]
                : $this->brokers[$name] = $this->resolve($name);
}
  

Комментарии:

1. Я уже проверил статью. Не могли бы вы любезно помочь мне понять, как это auth.password решается IlluminateAuthPasswordsPasswordBrokerManager ? getFacadeAccessor метод просто возвращает строку.