Auth类和auth()函数在Eloquent模型中不起作用。 (Laravel 5)

时间:2016-01-17 04:45:09

标签: php oop laravel

我尝试从会话表中获取在线用户。 为此,首先我将session_id列添加到会话表,然后每当刷新页面时我都尝试更新此user_id。这是Online.php模型,其中scopeUpdateCurrent()函数检查用户并更新会话表中的user_id:

namespace App;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Session;
use Auth;

class Online extends Model
{
  public $table = 'sessions';

  public $timestamps = false;

  public function user()
  {
    return $this->belongsTo('App\User');
  }

  ...

  public function scopeUpdateCurrent(Builder $query)
  {
    $user = auth()->user(); // returns null but user logged in
    // $user = Auth::user(); // returns null too

    return $query->where('id', Session::getId())->update([
        'user_id' => $user ? $user->id : null
    ]);
  }

}

这是我称之为更新的AppServiceProvider.php:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Online;

class AppServiceProvider extends ServiceProvider
{
  public function boot()
  {
    Online::updateCurrent();
    ...
  }
  ...
}

问题是auth() - > user()或Auth :: user()在Online.php模型中返回null但用户已登录。例如在某些View或routes.php中它返回有效的用户对象

可能不太清楚,因为我非常了解英语。如果写在评论中,我会尝试详细描述问题

1 个答案:

答案 0 :(得分:2)

这不是Eloquent模型的问题。您正试图在会话开始之前获取经过身份验证的用户。

例如,在app/Http/Kernel.php中,您将看到中间件列表。其中一个名为Illuminate\Session\Middleware\StartSession,负责开始你的会话。

您的服务提供商无法访问这些会话数据,因为它尚未启动。中间件在生命周期的后期启动。

解决方案是创建一个中间件来处理这个问题。在您的自定义中间件中,您可以添加一些代码,它将起作用。

如果您正在使用L5.2,则默认数据库会话处理程序已包含user_id并为您更新。