Laravel 5:Auth :: user()每次使用它时都会查询数据库吗?

时间:2016-10-16 00:09:01

标签: laravel laravel-5 laravel-facade

在用户的编辑个人资料页面上,我想显示当前登录用户详细信息的现有值,如姓名,电子邮件,性别等。我的问题如下

  1. 建议用户使用Auth :: user() - > name,Auth :: user() - >直接填写表格字段吗?或者我应该在我的控制器中创建一个像$user = Auth::user();这样的变量,然后像常规对象一样将它传递给$ user?
  2. 每次使用时,在给定视图文件上多次使用Auth :: user()会命中我的数据库吗?

    提前致谢。

2 个答案:

答案 0 :(得分:5)

如果查看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)

您只能获得1个数据库请求,因此多次使用Auth :: user()不是问题。

我建议您使用Laravel Debugbar作为应用优化的最舒适方式。