2016-10-16 1 views
1

На странице редактирования профиля пользователя, я хочу, чтобы показать существующие значения текущего вошедшего в детали пользователя, как имя, адрес электронной почты, пола и т.д. Мои вопросы следующим образомLaravel 5: запрашивает ли Auth :: user() базу данных каждый раз, когда я ее использую?

  1. Это рекомендуется пользователю Auth :: user() -> name, Auth :: user() -> email, чтобы заполнить поля формы? Или я должен создать переменную типа $user = Auth::user(); в моем контроллере и передать ее моему представлению $ user, как обычный объект?
  2. Использует ли Auth :: user() несколько раз в данном файле просмотра каждый раз, когда я его использую?

    Заранее спасибо.

ответ

4

Если вы посмотрите на 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

Вы получите только 1 запрос к базе данных, поэтому использование Auth :: user() несколько раз не является проблемой.

Я рекомендую использовать Laravel Debugbar как наиболее удобный способ оптимизации приложений.

Смежные вопросы