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

Laravel 5 : Does Auth::user() query the database everytime I use it?

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

  1. 是否建议用户 Auth::user()->name , Auth::user()->email 直接填充表单字段?或者我应该在我的控制器中创建一个像 $user = Auth::user(); 这样的变量,然后像普通对象一样将它传递给我的视图 $user 吗?

  2. 是否每次在给定视图文件上多次使用 Auth::user() 都会访问我的数据库?

    提前致谢。

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

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

如果您查看 Illuminate\Auth 中的 SessionGuard.php 文件,您将看到用于检索当前已验证用户的方法 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 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;
    }

因此,多次调用 user() 不会对数据库进行多次调用。