#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
метод просто возвращает строку.