Laravel 5: Auth::user() запрашивает базу данных каждый раз, когда я ее использую?
На странице редактирования профиля для пользователя я хочу показать существующие значения данных текущего вошедшего в систему пользователя, таких как имя, адрес электронной почты, пол и т. Д. У меня следующие вопросы
- Рекомендуется ли пользователю Auth::user()->name, Auth::user()->email напрямую заполнять поля формы? Или я должен создать переменную, как
$user = Auth::user();
в моем контроллере и передать его на мой взгляд $user, как обычный объект? Использует ли Auth:: user () несколько раз для данного файла представления каждый раз, когда я его использую?
Заранее спасибо.
2 ответа
Если вы посмотрите на SessionGuard.php
файл в Illuminate\Auth
, вы увидите метод user()
который используется для получения аутентифицированного пользователя:
/**
* Get the currently authenticated user.
*
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function user()
{
if ($this->loggedOut) {
return;
}
// If we've already retrieved the user for the current request we can just
// return it back immediately. We do not want to fetch the user data on
// every call to this method because that would be tremendously slow.
if (! is_null($this->user)) {
return $this->user;
}
$id = $this->session->get($this->getName());
// First we will try to load the user using the identifier in the session if
// one exists. Otherwise we will check for a "remember me" cookie in this
// request, and if one exists, attempt to retrieve the user using that.
$user = null;
if (! is_null($id)) {
if ($user = $this->provider->retrieveById($id)) {
$this->fireAuthenticatedEvent($user);
}
}
// If the user is null, but we decrypt a "recaller" cookie we can attempt to
// pull the user data on that cookie which serves as a remember cookie on
// the application. Once we have a user we can return it to the caller.
$recaller = $this->getRecaller();
if (is_null($user) && ! is_null($recaller)) {
$user = $this->getUserByRecaller($recaller);
if ($user) {
$this->updateSession($user->getAuthIdentifier());
$this->fireLoginEvent($user, true);
}
}
return $this->user = $user;
}
// Если мы уже получили пользователя для текущего запроса, мы можем сразу же вернуть его обратно. Мы не хотим получать пользовательские данные при каждом вызове этого метода, потому что это будет чрезвычайно медленно.
if (! is_null($this->user)) {
return $this->user;
}
Итак, называя user()
несколько раз не будет делать несколько звонков в базу данных.
Вы получите только 1 запрос к базе данных, поэтому многократное использование Auth::user() не является проблемой.
Я рекомендую вам использовать Laravel Debugbar как наиболее удобный способ оптимизации приложений.