我尝试从会话表中获取在线用户。 为此,首先我将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中它返回有效的用户对象
可能不太清楚,因为我非常了解英语。如果写在评论中,我会尝试详细描述问题
答案 0 :(得分:2)
这不是Eloquent模型的问题。您正试图在会话开始之前获取经过身份验证的用户。
例如,在app/Http/Kernel.php
中,您将看到中间件列表。其中一个名为Illuminate\Session\Middleware\StartSession
,负责开始你的会话。
您的服务提供商无法访问这些会话数据,因为它尚未启动。中间件在生命周期的后期启动。
解决方案是创建一个中间件来处理这个问题。在您的自定义中间件中,您可以添加一些代码,它将起作用。
如果您正在使用L5.2,则默认数据库会话处理程序已包含user_id
并为您更新。