为什么我能够在laravel中使用user()方法,甚至没有定义它

时间:2015-06-04 06:38:35

标签: php laravel eloquent laravel-5 laravel-middleware

我的Laravel 5来源中有UserControllerUser模型。 还有一个AuthController也存在(预装了laravel源)。

我想使用Eloquent Models在我的刀片中查询db中的数据。

但是,在我的User模型(Eloquent)和任何控制器中都没有定义user()方法。即使这样,我也可以通过从Auth课程访问它来在我的刀片中使用它。为什么呢?

例如,

在我的刀片中,{{ Auth::user()->fname }}有效。它从我的fname表中检索数据users并回显它。

它背后的逻辑是什么,我可以为tasks等其他数据库表模拟它吗?

3 个答案:

答案 0 :(得分:1)

无论何时自动或手动执行此操作

 if (Auth::attempt(['email' => $email, 'password' => $password])) 
{
}

所选用户的数据将存储在storage/framework/sessions

它的数据类似于

a:4:{s:6:"_token";s:40:"PEKGoLhoXMl1rUDNNq2besE1iSTtSKylFFIhuoZu";s:9:"_previous";a:1:{s:3:"url";s:43:"http://localhost/Learnings/laravel5/laravel";}s:9:"_sf2_meta";a:3:{s:1:"u";i:1432617607;s:1:"c";i:1432617607;s:1:"l";s:1:"0";}s:5:"flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}}

上面的会话文件没有任何数据,它将具有json格式的用户id,url,token等数据。

然后每当你调用{{ Auth::user()->fname }}时,Laravel都会识别你正在尝试获取登录用户的fname,那么laravel将获取该文件并获取用户的主键并从用户的表中引用它来自您的数据库。你可以为你拥有的用户table的所有颜色做到这一点。

您可以详细了解here

答案 1 :(得分:1)

此用户功能在

下定义
vendor/laravel/framework/src/Illuminate/Auth/Guard.php

以下内容:

/**
 * Get the currently authenticated user.
 *
 * @return \Illuminate\Contracts\Auth\Authenticatable|null
 */
public function user()
{
    if ($this->loggedOut) return;

    // If we have already retrieved the user for the current request we can just
    // return it back immediately. We do not want to pull the user data every
    // request into the method because that would tremendously slow an app.
    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))
    {
        $user = $this->provider->retrieveById($id);
    }

    // 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;
}

这个Guard.php中定义了更多的函数,我们偶尔使用它们甚至不知道它们来自何处

答案 2 :(得分:0)

这很有效,因为Laravel带来了不错的身份验证。

Auth是身份验证库,有很多这样的功能,请查看documentation