获取所有连接用户(Laravel 5)

时间:2015-09-19 08:30:44

标签: authentication laravel-5

如何在家中显示所有连接的用户?

1 个答案:

答案 0 :(得分:6)

这是一个非常基本的,但有望在Laravel5应用程序中检测GuestRegistered用户的有效方法。

第1步

打开文件config/session.php并将驱动程序更改为数据库。

第2步

我们需要创建会话表,因此请使用以下artisan命令php artisan session:table生成迁移文件。

第3步

在这个新生成的迁移中,您需要添加一个新的user_id列,这样我们就可以将会话与用户联系起来(如果该用户当然已登录)。

打开文件migrations/xxxx_xx_xx_xxxxxx_create_session_table.php并在Schema :: create:

中添加以下内容

$t->integer('user_id')->nullable();

以下是完整迁移的外观:

<?php

use Illuminate\Database\Migrations\Migration;

class CreateSessionTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('sessions', function($t) 
        {
            $t->string('id')->unique();
            $t->text('payload');
            $t->integer('last_activity');
            $t->integer('user_id')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('sessions');
    }

}

第4步

运行composer dump-autoloadphp artisan migrate

注意:如果您未在全球范围内安装Composer,请使用php composer.phar dump-autoload

第5步

将Eloquent Model保存在应用程序的某个位置Session.php

注意:建议保存位置在app目录中。

第6步

现在你只需要知道如何使用它。

。 。

<强>用法

将以下Session::updateCurrent();放在代码的某处,因为这样可以确保更新当前用户的会话条目,只是一个示例,您可以将其放在您的应用/路由上。 php文件。

获取所有用户(访客+已注册)

$all = Session::all();

如果您需要在线检查所有用户一段时间,例如10分钟,则需要调用activity(:limit)方法,如下所示:

$all = Session::activity(10)->get();

注意:此方法可以与guests()和/或registered()方法结合使用。

访客用户

抓住所有

$guests = Session::guests()->get();
Get the # of Guest users

$total = Session::guests()->count();

注册用户

抓住所有

$registered = Session::registered()->get();

foreach ($registered as $online) {
    // You can retrieve the user information using something like:
    var_dump($online->user->email);
}

获取注册用户数

$total = Session::registered()->count();

雄辩模型:

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Session;
use Illuminate\Database\Eloquent\Builder;
use Cartalyst\Sentinel\Laravel\Facades\Sentinel;

class Session extends Model 
{
    /**
     * {@inheritdoc}
     */
    public $table = 'sessions';

    /**
     * {@inheritdoc}
     */
    public $timestamps = false;

    /**
     * Returns the user that belongs to this entry.
     *
     * @return \Cartalyst\Sentinel\Users\EloquentUser
     */
    public function user()
    {
        return $this->belongsTo('Cartalyst\Sentinel\Users\EloquentUser');
    }

    /**
     * Returns all the users within the given activity.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @param  int  $limit
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeActivity($query, $limit = 10)
    {
        $lastActivity = strtotime(Carbon::now()->subMinutes($limit));

        return $query->where('last_activity', '>=', $lastActivity);
    }

    /**
     * Returns all the guest users.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeGuests(Builder $query)
    {
        return $query->whereNull('user_id');
    }

    /**
     * Returns all the registered users.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeRegistered(Builder $query)
    {
        return $query->whereNotNull('user_id')->with('user');
    }

    /**
     * Updates the session of the current user.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeUpdateCurrent(Builder $query)
    {
        $user = Sentinel::check();

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

您也可以尝试this